2014-10-16 83 views
0

当为两个变量输入'1'时,为什么不打印“真”?我怎样才能解决这个问题?比较int和char与铸造

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; 
} 

回答

1

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

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

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

如果你想看看int是否包含1char包含'1'匹配,那么你可以利用所有的数字都按顺序发现从48开始ASCII的财产,或'0'

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

但是,如果你这样做,你应该确认:

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

如果可以的话,通常要避免这些黑客行为。通常有另一种方法来检查你的输入。

+0

我希望函数在输入相等值时输出'true',即char ='2'和int = 2,当输入不同值时为false。感谢您的解释。 – blzn 2014-10-16 23:54:56

+0

@blzn:然后看看我的编辑。 – 2014-10-16 23:57:22

2

即使char是整数类型,它是由操作者>>从其他整数类型区别对待。

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

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

这就是导致您的情况不平等的原因。