【问题标题】:Constant int incement [duplicate]常量 int 增量
【发布时间】:2016-10-07 05:37:00
【问题描述】:

考虑以下两种情况。 case1: 编译器错误 --> 错误: 只读变量‘x’的增量

    #include<stdio.h>
    main()
    {
    const int x=5;
    printf("%d",++x);
    }

case2:运行成功,输出为 6。为什么?

   #include<stdio.h>
   main()
   {
   const int x=5;
   int *ptr=&x;
   ++(*ptr);
   printf("%d",x);
   }

【问题讨论】:

  • 第二个导致未定义的行为。您使用指向非常量int 的指针来修改常量int。一个好的编译器应该警告它,如果没有,那么你应该打开更多警告。
  • 警告:初始化会丢弃指针目标类型的限定符
  • 所以 case2 应该是 int const *ptr=&x 以获得与 case1 相同的行为。

标签: c pointers


【解决方案1】:

int *ptr=&amp;x; 是违反约束的,即“错误”,无效代码。 C 语言不支持将const int * 类型隐式转换为int * 类型。您的编译器肯定会为此发出诊断消息。

在那条诊断消息之后,您的程序的行为不再由 C 语言定义,假设您的编译器以某种方式同意编译它。许多 C 编译器可以配置为拒绝编译此代码,即使它们在默认模式下接受它。

您可以使用强制转换来强制转换

int *ptr = (int *) &x;

这将摆脱上述约束违规。编译器现在必须接受您的代码(有一些警告)。但是在修改之后,尝试执行++*ptr 会触发未定义的行为,因为它是在尝试修改const 对象。

【讨论】:

  • 所以 case2 应该是 int const *ptr=&x 以获得与 case1 相同的行为
  • @Vijay S B:是的,这是一种方法。您还可以强制进行显式转换(见上文)以消除错误,但改为运行到 UB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2017-06-01
  • 1970-01-01
相关资源
最近更新 更多