Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 两个字符之和_C_Return_Ascii - Fatal编程技术网

C 两个字符之和

C 两个字符之和,c,return,ascii,C,Return,Ascii,首先,这是我制作的一个小程序: #include <stdio.h> int main(void) { char z = '"' + '!'; printf("%c\n", z); return 0; } 一切似乎都很好 但是,当我尝试做:‘a’+‘b’时,它会给我’\303’。为什么? a ---> 97 b ---> 98 97 + 98 = 195. 195在ASCII表之外,所以我希望有一条错误消息 提前谢谢你的帮助,谢谢你对我的

首先,这是我制作的一个小程序:

#include <stdio.h>
int main(void) {
    char z = '"' + '!';
    printf("%c\n", z);
    return 0;
}
一切似乎都很好

但是,当我尝试做:‘a’+‘b’时,它会给我’\303’。为什么?

a ---> 97
b ---> 98 

97 + 98 = 195. 

195在ASCII表之外,所以我希望有一条错误消息


提前谢谢你的帮助,谢谢你对我的蹩脚英语的全面了解

遗憾的是,它不会给出错误消息。与C语言一样,它没有错误,而是有未定义的行为,这使得调试很多问题变得困难,因为它在语法上是有效的,但在技术上是错误的。这是C++中添加异常的原因,但这是一个话题。

正如评论中提到的,“a'+'b'实际上是195,八进制是303。将无符号195重新解释为有符号值是-61,请参见下文了解更多信息。在这两种情况下,它们都超出了ascii字符的可打印范围。在我的控制台上,它打印一个� 但这是非标准的,不同的控制台会在那里打印不同的东西

解决方法是确保在调用printf之前将有意义的数据传递给printf,并且不希望printf执行检测工作

旁注:您应该在编译器中打开所有警告,它们通常会捕获许多此类问题


旁注2:如果'a'+'b'产生了一个带符号的字符,那么它将是-61,但实际上它是一个32位的int。您可以用sizeof'a'+'b'返回4来检查这一点。所以打印的数字是195,它仍然不能映射到ASCII表中的有效字符。

它到底打印什么?它可能取决于您的编码集。当我们计算字符时,它们将转换为十进制值:是的,除了编码文本之外,没有文本。了解正在使用的字符集和编码可能非常重要,而且可能不是ASCII码。在控制台中执行区域设置或chcp。顺便说一句,“\303”是195。从-128到127的所有字符值都是[-128,127]范围内有符号值的可打印字符。以下代码全部打印:int z;对于z=0;z<256;z++printf%c\n,charz;。由于溢出,char97+98等于-61。195在ASCII表之外。如果为true,则C不定义为任何运行时代码打印错误消息。代码执行正确-您只希望出现错误。问题的细节在“a”+“b”中,它给了我“\303”。。相反,在没有发布代码的情况下,您描述了它,没有详细说明如何通过终端输出、调试器等观察输出。发布内容不必要地不清楚。在未来,建议1张贴真实代码2输入,3观察输出,4预期输出。在字母和符号上使用数学并没有真正意义。在其他语言中,'a'+'b'产生ab,但我们只能猜测'a'*'b'或'a'/'b'应该返回什么。换句话说,在C语言中,你所说的字母实际上是简单的、定义良好的数字。在printf中没有未定义的行为。将无符号195重新解释为有符号值是-61。由于总和不是unsigned,而是int,所以mis引导。不同的控制台将打印不同的内容,这是真的,但这不是未定义的行为,而是实现指定的行为。printf%c\n,195;在C中定义为。。。int参数转换为无符号字符,并写入结果字符。因此,修复方法是确保在调用printf之前将有效数据传递给printf,而不是修复方法。
a ---> 97
b ---> 98 

97 + 98 = 195.