joh*_*dav 3 c++ string char c++11 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;
}
Run Code Online (Sandbox Code Playgroud)
此示例生成以下输出:
$ ./program
49
1
49
Run Code Online (Sandbox Code Playgroud)
这里似乎发生的事情是,当从单个数字整数表达式到字符的转换发生在流语句之外时,它会成功,但是当它在这样的语句中发生时,它会产生垃圾回答.
我试图找到其他人在谷歌上问类似的东西,但我找不到任何相关的东西.
我(Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609在Ubuntu 16.04 LTS x64上使用g ++ ,但问题也出现在clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)中,这排除了编译器错误.
结果int + char是一个int.所以,当你这样做
char c = 1 + '0';
Run Code Online (Sandbox Code Playgroud)
你真的得到了
char c = 49;
Run Code Online (Sandbox Code Playgroud)
现在c有了价值49.当溜溜去打印,虽然,cout的operator <<过载采取了char和而不是显示49它会显示该字符49代表.
当你这样做
std::cout << 1 + '0' << std::endl;
Run Code Online (Sandbox Code Playgroud)
既然1 + '0'是int你得到int的过载operator <<刚刚输出的整数49.
应该注意的是,在进行算术运算时,任何小于a的东西int都会被提升为a int.这意味着,char + char,short + short,char + short,...,都将是一个int所以即使做这样的事情
std::cout << static_cast<char>(1) + '0' << std::endl;
Run Code Online (Sandbox Code Playgroud)
仍会给你一个整数输出.你必须将结果强制转换为a char来获得char类似的结果
std::cout << static_cast<char>(1 + '0') << std::endl;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |