我试图打印Ascii字符,我发现使用char c = NUM; printf("%c", c);将适用于某些数字(尝试使用Ascii数字的某些字母表)但有些会导致运行时错误,为什么会这样?
#include <stdio.h>
int 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;
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么最后一部分工作而第三部分for循环不是?
在看到下面的答案之后,我明白我的循环已经病态了,我应该在127而不是128停止它.但是,当我尝试这个改变时 - 它根本没有输出:
for(unsigned char c = 0; c < 255; c++){
printf("%c", c);
}
Run Code Online (Sandbox Code Playgroud)
和
for(char c = -128; c < 127; c++){
printf("%c", c);
}
Run Code Online (Sandbox Code Playgroud)
使用警告进行编译将始终有所帮助:
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++){
^
Run Code Online (Sandbox Code Playgroud)
有符号字符可以容纳的最大值是127.因此,循环将永远不会结束,并将永远在-128和127之间循环.
编辑:
但正如@SilasAbrusco所提到的:一旦d增加到127之后,行为实际上是未定义的,请参阅:C++中有符号整数溢出是否仍未定义?