两个字符的总和

时间:2016-09-13 16:35:00

标签: c return ascii

首先,这是我所做的小程序:

#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表之外,所以我希望有一条错误信息。

提前感谢您的帮助,感谢您对我破碎的英语的全面了解!

1 个答案:

答案 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表中的有效字符。