我试图打印Ascii字符,我发现使用char c = NUM; printf("%c", c);
将适用于某些数字(尝试使用Ascii数字的某些字母表)但有些会导致运行时错误,为什么会这样?
#includeint main(void) { for(int i = 0; i < 128; i++){ printf("%c", i); // WORKS FINE } for(char c = '!'; c < '~'; c++){ printf("%c", c); //WORKS FINE } #if 0 for(char d = 0; d < 128; d++){ printf("%c", d); //IF REMOVED #if 0 --> RUNTIME ERROR } #endif // HOWEVER char e = 105; printf("%c", e); //OK return 0; }
那么,为什么最后一部分工作而第三部分for循环不是?
编辑在看到下面的答案之后,我明白我的循环已经病态了,我应该在127而不是128停止它.但是,当我尝试这个改变时 - 它根本没有输出:
for(unsigned char c = 0; c < 255; c++){ printf("%c", c); }
和
for(char c = -128; c < 127; c++){ printf("%c", c); }
marcolz.. 5
使用警告进行编译将始终有所帮助:
char.c:9:2: warning: comparison is always true due to limited range of data type [-Wtype-limits] for(char d = 0; d < 128; d++){ ^
有符号字符可以容纳的最大值是127.因此,循环将永远不会结束,并将永远在-128和127之间循环.
编辑:
但正如@SilasAbrusco所提到的:一旦d增加到127之后,行为实际上是未定义的,请参阅:C++中有符号整数溢出是否仍未定义?
使用警告进行编译将始终有所帮助:
char.c:9:2: warning: comparison is always true due to limited range of data type [-Wtype-limits] for(char d = 0; d < 128; d++){ ^
有符号字符可以容纳的最大值是127.因此,循环将永远不会结束,并将永远在-128和127之间循环.
编辑:
但正如@SilasAbrusco所提到的:一旦d增加到127之后,行为实际上是未定义的,请参阅:C++中有符号整数溢出是否仍未定义?