为什么表达式的结果取决于表达式的放置位置?

时间:2018-04-04 15:24:09

标签: c++ string c++11 char integer-arithmetic

我目前正在开发一个更复杂的程序,我遇到了一个非常奇怪的语法错误,最好用以下最小例子来证明:

#include <iostream>

int main(int argc, char *argv[]){
        char c = 1 + '0';
        std::cout << 1 + '0' << std::endl;
        std::cout << c << std::endl;
        std::cout << '0' + 1 << std::endl;
        return 1;
}

此示例生成以下输出:

$ ./program
49
1
49

这里似乎发生的事情是,当从单个数字整数表达式到字符的转换发生在流语句之外时,它会成功,但是当它在这样的语句中发生时,它会产生垃圾回答。

我试图在谷歌上找别人问类似的东西,但我找不到任何相关内容。

我在Ubuntu 16.04 LTS x64上使用g ++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609,但问题也出现在clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)中,它排除了编译器错误。

2 个答案:

答案 0 :(得分:7)

int + char的结果是int。所以当你这样做时

char c = 1 + '0';

你真的得到了

char c = 49;

现在c的值为49。如果你去打印,cout的{​​{1}}超载了operator <<,而不是显示char,它会显示49的字符表示。

当你这样做时

49

由于std::cout << 1 + '0' << std::endl; 1 + '0',因此int的{​​{1}}重载只会输出整数49。

应该注意的是,在进行算术运算时,任何小于int的内容都会被提升为operator <<。这意味着,intintchar + char,...,都将成为short + short,所以甚至可以做类似的事情

char + short

仍然会给你一个整数输出。您必须将结果转换回int以获得std::cout << static_cast<char>(1) + '0' << std::endl; 之类的

char

答案 1 :(得分:0)

  

但是当它发生在这样的声明中时,会产生垃圾   答案。

没有

char c = 1 + '0';
std::cout << c << std::endl;

在这种情况下,右值int会隐式转换为char。然后char重载与std::cout一起使用,导致'1'为ASCII。

std::cout << 1 + '0' << std::endl;

在这种情况下,您将立即打印出整数,因此选择整数重载,这将打印'1'的数值49。