gpt4 book ai didi

c - 当声明了字符变量但将字符放在双引号中时会发生什么?

转载 作者:行者123 更新时间:2023-11-30 21:14:15 24 4
gpt4 key购买 nike

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

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

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

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

当我将 "A" 替换为 'A' 时,它会按预期工作并使用 %c 打印 A > 和 65%d

最佳答案

Why does this print a question mark kind of symbol?

您希望它打印什么?

您从字符串文字“A”开始。您可能知道,C 中的字符串在内部表示为字符数组。因此,您有一个字符数组,您尝试将其分配给单个字符。您预计会发生什么?您是否期望它自动从数组中取出第一个字符。或者什么(然后扔掉剩下的)?嗯,事实并非如此。 (目前还不清楚会发生什么;可能不会发生任何合理的事情。)

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

听起来发生的事情是你得到了一个字节的指针值,它的值恰好是 4,并以问号的形式打印在你的显示器上。

Why does this not raise an error?

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

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

作为一般规则,C 编译器不会非常努力地保护您免受自身侵害。他们假设你知道自己在做什么。这可以同时是非常解放和相当可怕的。

C 可以是一个非常强大的工具 - 但您必须首先学习它,并且必须了解要注意的事项。如果你希望能够在尝试一些东西时犯错误,如果你希望语言能够尝试弄清楚你的意思,并在你感到困惑或不精确时握住你的手,并警告你可能发生的一切错了,那么你会发现 C 语言使用起来永远令人沮丧,因为这不是它的工作方式。

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

关于c - 当声明了字符变量但将字符放在双引号中时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57857390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com