【问题标题】:Comparing int and char with cast比较 int 和 char 与 cast
【发布时间】:2014-10-16 23:42:40
【问题描述】:

当两个变量都输入“1”时,为什么函数不打印“true”?我该如何解决这个问题?

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

【问题讨论】:

    标签: c++ casting type-conversion


    【解决方案1】:

    尽管char 是整数类型,但&gt;&gt; 运算符对它的处理方式与其他整数类型不同。

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

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

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

    【讨论】:

      【解决方案2】:

      与其他输入流对象一样,std::cin 旨在在您读取不同类型时以不同方式工作。

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

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

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

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

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

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

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

      【讨论】:

      • 我希望函数在输入相等的值时打印“真”,即 char = '2' 和 int = 2,当输入不同的值时打印为假。谢谢你的解释。
      猜你喜欢
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2014-05-17
      • 2013-05-10
      • 2013-06-15
      • 1970-01-01
      相关资源
      最近更新 更多