我从一个博客中找到了这个代码片段,该博客要求它的输出和解释。
#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
即p + 2
)将取决于是否p
已经指向一个数组,并且至少在其后还有另一个数组元素。在您的确切程序中,由于该程序无效,因此无济于事。
同样,printf
由于我们已经摆脱了束缚,因此问题也无济于事。但是for的操作数%d
必须具有类型int
(不能是指针)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句