- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在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/
我创建了一个分支来开发新功能。由于这个新功能完全是作为一个新项目开发的,唯一可能的冲突来源是解决方案文件。 随着功能的开发,主分支更新了几次。当我完成开发和测试时,我做了: git checkout
我是一名优秀的程序员,十分优秀!