如果声明了字符变量但将字符放在双引号中会发生什么?

-4 c string character

我在C中声明了以下字符:

char x="A";
printf("%c", x);
Run Code Online (Sandbox Code Playgroud)

为什么这会打印一个问号类型的符号,并且如果我将格式说明符更改为%d,它会打印4?

为什么这不会引发错误?这些输出为何如此?

当我替换为时"A"'A'它可以按需要工作,并A%c65一起打印%d

Ste*_*mit 6

为什么这样打印问号类型的符号?

您希望它打印什么?

您从字符串常量开始"A"。您可能知道,C中的字符串在内部表示为字符数组。因此,您有一个字符数组,您试图将其分配给单个字符。您期望会发生什么?您是否期望它会自动从数组中获取第一个字符?还是什么(剩下的丢掉)?好吧,这不是发生的事情。(尚不清楚应该发生什么;可能没有合理的事情发生。)

但实际上,我撒了谎:您没有尝试获取一个字符数组,而是尝试将其分配给单个字符。在大多数情况下(包括此处),当您尝试使用数组的值时,得到的是指向数组第一个元素的指针。因此,实际上您有一个指向某些字符的指针,您试图将其分配给单个字符。但是,您又期待什么呢?您是否希望它会自动采用指向字符?好吧,那也不是。(同样,不清楚应该发生什么。)

听起来发生的事情是,您得到了指针值的一个字节,恰好具有值4,并在显示屏上打印出一个问号。

为什么这不会引发错误?

好吧,看来您正在使用旧的编译器来妨碍自己。一个现代的C编译器肯定会在错误的初始化中警告类型不匹配(指针与字符)。

但是,另一个原因是C是一种古老的语言,可能与您的期望不符。

通常,C编译器不会很努力地保护您自己。他们以为您知道自己在做什么。同时这可以是非常解放的,而且非常可怕。

C可以是一个非常强大的工具-但是您只需要首先学习它,就必须学习要注意的地方。如果您希望能够尝试一些东西时大失所望,如果您希望该语言尝试弄清楚您的意思,并在感到困惑或不精确时手牵着您,并警告您可能存在的一切错误的话,那么您将发现C是一种令人沮丧的使用语言,因为那不是它的工作方式。

另请参阅有关启用C编译器的非默认警告是否是一个好主意的问题