常量int intcement

时间:2016-10-07 05:37:00

标签: c pointers

考虑以下两种情况。 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);
   }

1 个答案:

答案 0 :(得分:3)

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

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

您可以使用强制转换

强制转换
int *ptr = (int *) &x;

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