比较int和char与cast

时间:2014-10-16 23:42:40

标签: c++ casting type-conversion

为什么功能不打印" true"当' 1'是两个变量的输入?我该如何解决这个问题?

int main() {
    int i;
    char c;
    cout << "Type int: ";
    cin  >> i;
    cout << "Type char: ";
    cin  >> c;
    if (i == (int)c)
        cout << "true" << endl;
    else 
        cout << "false" << endl;
}

2 个答案:

答案 0 :(得分:2)

即使char是整数类型,>>运算符也会处理它与其他整数类型不同。

  • 对于非char整数收件人变量,>>运算符将输入视为整数值的表示。整个表示从输入中消耗,转换为整数并存储在recepient变量中。例如,如果输入8作为输入,则收件人变量(例如,int)将接收整数值8。如果输入42作为输入,则收件人变量将收到整数值42

  • 但对于char收件人变量,>>运算符将输入视为纯粹的字符序列。仅消耗该序列的第一个字符并立即存储在接收方变量中。例如,如果您输入8作为输入,char收件人变量将收到字符 '8',其对应于整数值56 。如果输入42作为输入,则收件人变量将接收字符'4',其对应于整数值52

这就是导致你案件不平等的原因。

答案 1 :(得分:1)

与其他输入流对象一样,std::cin设计为在您阅读不同类型时的工作方式不同。

对于int,它会读取您写入控制台的数字并将其解析为内部整数形式。这很方便:“格式化提取”意味着我们可以立即获得有用的int,并且不需要从字符串到数字进行任何转换。

对于char,它会读取您写入控制台的实际字母或数字或标点符号;它没有解析它。它只是存储该角色。在这种情况下,c为49,因为这是'1'的ASCII值。

如果您想查看int包含1char包含'1'是否匹配,那么您可以利用ASCII的属性,所有数字都是从48开始按顺序排列,或'0'

if (`i` == `c`-'0')

但是,如果您这样做,则应验证:

  • 您的平台使用ASCII;
  • c包含一个数字('0', '1', ..., '9')。

如果可以的话,一般要避免这些黑客攻击。通常还有另一种检查输入的方法。