C 当字符变量被声明但字符被置于双引号中时会发生什么?

C 当字符变量被声明但字符被置于双引号中时会发生什么?,c,string,character,C,String,Character,我在C中声明了一个字符,如下所示: char x="A"; printf("%c", x); 为什么这会打印问号类型的符号,如果我将格式说明符更改为%d,它会打印4 为什么这不会引起错误,为什么这些输出是这样的 >当我替换“a /代码> > a '< /代码>时,按要求运行,并打印 > > 65代码>代码> >代码> %d > > C++(和C),双引号“”用于表示代码>字符串文字,而不是字符。只有单引号'对声明如下char数据类型有效: char c = 'a'; 因此,

我在C中声明了一个字符,如下所示:

char x="A";
printf("%c", x);
为什么这会打印问号类型的符号,如果我将格式说明符更改为
%d
,它会打印4

为什么这不会引起错误,为什么这些输出是这样的

<> >当我替换<代码>“a /代码> <代码> > a '< /代码>时,按要求运行,并打印<代码> <代码> > <代码> <代码> > <代码> 65代码>代码> >代码> %d <代码> >

<> > C++(和C),双引号<代码>“”用于表示代码>字符串文字,而不是字符。只有单引号
'
对声明如下
char
数据类型有效:

char c = 'a';
因此,当您试图打印此文件时,它只会输出垃圾。


关于您的声明,这是我第一次看到在同一个变量上声明两种类型,这肯定会引发错误。

我不知道如何测试代码,因为行
char int
会引发错误。如果只添加一种类型,则输出将为零字符。 发生这种行为是因为C中
字符串的最后一个字符是
\0
([null termination])()。因此,如果使用
,编译器将
A
替换为
A\0
。当您使用
'
时,编译器不会添加空终止符并将字符解释为单个值

为什么要打印问号之类的符号

你希望它打印什么

您从字符串literal
“A”
开始。您可能知道,C中的字符串在内部表示为字符数组。所以您有一个字符数组,您试图将其分配给单个字符。你以为会发生什么?您是否希望它自动从数组中获取第一个字符,。还是什么(把剩下的扔掉)?但事实并非如此。(不清楚应该发生什么;可能不会发生合理的事情。)

但事实上,我撒谎了:您没有尝试获取字符数组,并尝试将其分配给单个字符。大多数时候,包括这里,当您尝试使用数组的值时,您得到的是指向数组的第一个元素的指针。实际上,您有一个指向某些字符的指针,您试图将其分配给单个字符。但再一次,你期望会发生什么?您是否希望它自动接受指向字符?嗯,事情也不是这样的。(同样,我们也不清楚应该发生什么。)

听起来好像发生了一个字节的指针值,正好值为4,并在显示器上打印为问号

为什么这不会引起错误

好吧,看起来你在用一个非常旧的编译器来限制自己。现代C编译器肯定会警告错误初始化中的类型不匹配(指针与字符)

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

一般来说,C编译器并不努力工作来保护您免受自己的伤害。他们认为你知道自己在做什么。这可以同时是非常解放和相当可怕的

C可以是一个非常强大的工具——但是你只需要先学习它,然后你就必须学习要注意什么。如果你想在尝试一些东西时犯错误,如果你希望这种语言能够理解你的意思,当你感到困惑或不准确时,握住你的手,警告你所有可能出错的事情,那么你会发现C是一种永远令人沮丧的语言,因为事情不是这样的


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

char int
-so
char
int
char int x=“a”不是有效的声明。它是一个
char
还是一个
int
?而且你不能将
char*
分配给
char
int
。我的错误。它应该是
char x=“A”