>我在 C 中声明了一个字符,如下所示:
char x="A";
printf("%c", x);
为什么这会打印一个问号类型的符号,如果我将格式说明符更改为%d
,它会打印 4?
为什么这不会引发错误,为什么这些输出是这样的?
当我用'A'
替换"A"
时,它可以根据需要工作,并打印A
%c
和65
%d
。
为什么这会打印一个问号类型的符号?
你期望它打印什么?
您从字符串文字"A"
开始。 如您所知,C 中的字符串在内部表示为字符数组。 因此,您有一个字符数组,您尝试将其分配给单个字符。 你期望会发生什么? 您是否期望它自动从数组中获取第一个字符。还是什么(扔掉其余的(? 好吧,事实并非如此。 (目前还不清楚应该发生什么;可能没有合理的事情可能发生。
但事实上,我撒了谎:你没有试图获取一个字符数组,并试图将其分配给单个字符。 大多数时候,包括这里,当你尝试使用数组的值时,你得到的是一个指向数组第一个元素的指针。 因此,您实际上有一个指向某些字符的指针,您尝试将其分配给单个字符。 但同样,你期望会发生什么? 您是否期望它自动采用指向字符? 好吧,那也不是发生的事情。 (而且,同样,目前还不清楚应该发生什么。
听起来发生的事情是你得到了一个字节的指针值,它恰好有值 4,并且作为问号打印在显示屏上。
为什么这不会引发错误?
好吧,看起来你通过使用一个非常旧的编译器来阻碍自己。 现代 C 编译器肯定会警告错误初始化中的类型不匹配(指针与字符(。
但另一个原因是C是一种老派语言,可能不符合你的期望。
作为一般规则,C 编译器不会非常努力地保护您免受自己的伤害。 他们假设你知道自己在做什么。 这既可以非常自由,又相当可怕。
C 可以是一个非常强大的工具——但你只需要先学习它,你必须学会要小心什么。 如果你想在尝试东西时犯错,如果你期望语言试图弄清楚你的意思,并在你困惑或不精确时握住你的手,并警告你所有可能出错的事情,那么你会发现C是一种永远令人沮丧的语言, 因为这不是它的工作方式。
另请参阅此问题,了解启用 C 编译器的非默认警告是否是个好主意。
在C++(和 C(中,双引号" "
用于表示string
文字,而不是字符。只有单引号' '
可用于声明char
数据类型,如下所示:
char c = 'a';
因此,当您尝试打印此内容时,它只会输出垃圾。
关于您的声明,这是我第一次看到在同一变量上声明两种类型,这肯定会引发错误。
我不知道你是如何测试你的代码的,因为char int
行会抛出错误。如果只添加一种类型,则输出将为零字符。 发生此行为的原因是 C 中string
的最后一个字符是