首先,这是我所做的小程序:
#include <stdio.h>
int main(void) {
char z = '"' + '!';
printf("%c\n", z);
return 0;
}
控制台给我&#39; C&#39;。所以我觉得这很正常。我读过,当我们计算字符时,它们会变成十进制值。
ASCII ----> decimal
'"' ----> 34
'!"----> 33
34 + 33 = 67
C-----> 67
一切似乎都好。
但是,当我尝试做的时候:&#39; a&#39; +&#39; b&#39;,它给了我&#39; \ 303;为什么?
a ---> 97
b ---> 98
97 + 98 = 195.
195在ASCII表之外,所以我希望有一条错误信息。
提前感谢您的帮助,感谢您对我破碎的英语的全面了解!
答案 0 :(得分:-1)
可悲的是,它不会给出错误信息。与C一样,它不是错误而是具有“未定义的行为”,这使得调试很多问题变得困难,因为它在语法上是有效的,但在技术上是错误的。这就是为什么在C ++中添加异常的原因很多,但这是主题。
正如评论中所提到的,'a'+'b'实际上是195,其中八进制是303. 将无符号195重新解释为有符号值是-61 (有关详细信息,请参见下文)这个)。在这两种情况下,它们都不在ascii字符的可打印范围内。在我的控制台上它会打印一个 但这是非标准的,不同的控制台会在那里打印不同的东西。
修复是为了确保在调用之前将有意义的数据传递给printf,并且没有期望printf执行检测它的工作。
附注:您应该使用编译器打开所有警告,他们经常会遇到许多这些问题。
附注2:如果'a'+'b'产生signed char
,那么它将是-61,但它实际上是32位int。你可以用sizeof('a' + 'b')
返回4来检查这一点。所以打印的数字是195,它仍然没有映射到ASCII表中的有效字符。