首页 > 解决方案 > 如何解释以下代码的输出?(与 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)。

标签: cpointerscastingundefined-behavior

解决方案


此代码不正确:

int *const volatile p = 5;

整数不能分配给(或初始化,规则相同)指针,除了零值的常量表达式的特殊情况。编译器必须给出诊断并且可以拒绝该程序。如果它确实生成了一个可执行文件,那么语言规则将不再适用,因为代码违反了合同。

这段代码很糟糕,因为它在没有适当转换的情况下在 int* 和 int 之间执行算术运算。

您可以在不进行强制转换的情况下添加整数和指针。事实上,这是正常的做法。这意味着您将指针推进它所指向的元素的数量。

尽管如此,指针算术必须保持在数组对象的范围内,或者指向过去的一端。(为此,非数组可以被视为大小为 1 的数组)。5/2 + p因此, ie的有效性p + 2将取决于是否p已经指向一个数组,并且至少在它之后还有另一个数组元素。在您的确切程序中,它没有实际意义,因为该程序无效。

同样,这个问题printf也没有实际意义,因为我们已经脱轨了。但是 for 的操作数%d必须有类型int (不能是指针)。


推荐阅读