我目前正在开发一个更复杂的程序,我遇到了一个非常奇怪的语法错误,最好用以下最小例子来证明:
#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)
中,它排除了编译器错误。
答案 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 <<
。这意味着,int
,int
,char + 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。