c - 如何解释以下代码的输出?(与 C 中的类型转换有关)
问题描述
我从一个要求它的输出和解释的博客中发现了这个代码片段。
#include<stdio.h>
int main()
{
int *const volatile p = 5;
printf("%d\n",5/2+p);
return 0;
}
到目前为止,这是我的理解:
1. const 和 volatile 关键字在输出的上下文中没有贡献
2.这段代码很糟糕,因为它在没有适当转换的情况下在 int* 和 int 之间执行算术运算。
3.我最初假设输出应该是未定义的。博客说答案是 13(我通过实验发现的)。
问:我不明白 13 是如何获得的,是编译器未定义行为的结果吗?
4.我使用gdb确定关键在于操作p+2
,其中p是指针(保存值5),2是整数除法的结果(5/2)。
解决方案
此代码不正确:
int *const volatile p = 5;
整数不能分配给(或初始化,规则相同)指针,除了零值的常量表达式的特殊情况。编译器必须给出诊断并且可以拒绝该程序。如果它确实生成了一个可执行文件,那么语言规则将不再适用,因为代码违反了合同。
这段代码很糟糕,因为它在没有适当转换的情况下在 int* 和 int 之间执行算术运算。
您可以在不进行强制转换的情况下添加整数和指针。事实上,这是正常的做法。这意味着您将指针推进它所指向的元素的数量。
尽管如此,指针算术必须保持在数组对象的范围内,或者指向过去的一端。(为此,非数组可以被视为大小为 1 的数组)。5/2 + p
因此, ie的有效性p + 2
将取决于是否p
已经指向一个数组,并且至少在它之后还有另一个数组元素。在您的确切程序中,它没有实际意义,因为该程序无效。
同样,这个问题printf
也没有实际意义,因为我们已经脱轨了。但是 for 的操作数%d
必须有类型int
(不能是指针)。
推荐阅读
- javascript - 加载时间好慢
- raspberry-pi - raspberry pi 作为具有强制门户的接入点
- c - scanf格式字符串中不同位置的空格有什么影响?
- python-3.x - 连接两个视频剪辑
- python - jinja2,一些循环和两个表对象有问题
- web-crawler - 在本地模式下运行 StormCrawler 或安装 Apache Storm?
- cmake - Cmake Qt5 | 未定义对`QPrinter::QPrinter(QPrinter::PrinterMode) 的引用
- pandas - 在熊猫中转换日期时间
- python - 检索熊猫数据框中属性的对应行
- java - 以编程方式创建包含 ConstraintLayout 的多个 LinearLayout?