C语言 当声明了字符变量但字符放在双引号中时会发生什么?



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

char x="A";
printf("%c", x);

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

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

当我用'A'替换"A"时,它可以根据需要工作,并打印A%c65%d

为什么这会打印一个问号类型的符号?

你期望它打印什么?

您从字符串文字"A"开始。 如您所知,C 中的字符串在内部表示为字符数组。 因此,您有一个字符数组,您尝试将其分配给单个字符。 你期望会发生什么? 您是否期望它自动从数组中获取第一个字符。还是什么(扔掉其余的(? 好吧,事实并非如此。 (目前还不清楚应该发生什么;可能没有合理的事情可能发生。

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

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

为什么这不会引发错误?

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

但另一个原因是C是一种老派语言,可能不符合你的期望。

作为一般规则,C 编译器不会非常努力地保护您免受自己的伤害。 他们假设你知道自己在做什么。 这既可以非常自由,又相当可怕。

C 可以是一个非常强大的工具——但你只需要先学习它,你必须学会要小心什么。 如果你想在尝试东西时犯错,如果你期望语言试图弄清楚你的意思,并在你困惑或不精确时握住你的手,并警告你所有可能出错的事情,那么你会发现C是一种永远令人沮丧的语言, 因为这不是它的工作方式。

另请参阅此问题,了解启用 C 编译器的非默认警告是否是个好主意。

在C++(和 C(中,双引号" "用于表示string文字,而不是字符。只有单引号' '可用于声明char数据类型,如下所示:

char c = 'a';

因此,当您尝试打印此内容时,它只会输出垃圾。


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

我不知道你是如何测试你的代码的,因为char int行会抛出错误。如果只添加一种类型,则输出将为零字符。 发生此行为的原因是 C 中string的最后一个字符是([空终止]((https://en.wikipedia.org/wiki/Null-terminated_string(。因此,如果您使用"",编译器会将您的A替换为A。使用''编译器不会添加 null 终止并将字符解释为单个值。

最新更新