C 恒定激励

C 恒定激励,c,pointers,C,Pointers,考虑以下两种情况。 案例1:编译器错误-->错误:只读变量“x”的增量 #include<stdio.h> main() { const int x=5; printf("%d",++x); } #包括 main() { 常数int x=5; printf(“%d”,+x); } 案例2:使用输出6成功运行。为什么? #include<stdio.h> main() { const int x=5

考虑以下两种情况。 案例1:编译器错误-->错误:只读变量“x”的增量

    #include<stdio.h>
    main()
    {
    const int x=5;
    printf("%d",++x);
    }
#包括
main()
{
常数int x=5;
printf(“%d”,+x);
}
案例2:使用输出6成功运行。为什么?

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

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

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

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

int *ptr = (int *) &x;

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

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

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

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

int *ptr = (int *) &x;

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

第二个操作会导致未定义的行为。您可以使用指向非常量
int
的指针来修改常量
int
。一个好的编译器应该对此发出警告,如果没有,那么您应该打开更多警告。警告:初始化会丢弃指针目标类型的限定符,因此case2应该是int const*ptr=&x,以获得与case1相同的行为。第二个会导致未定义的行为。您可以使用指向非常量
int
的指针来修改常量
int
。一个好的编译器应该对此发出警告,如果没有,那么您应该打开更多警告。警告:初始化会丢弃指针目标类型的限定符,因此case2应该是int-const*ptr=&x,以获得与case1相同的行为。因此case2应该是int-const*ptr=&x,以获得与case1相同的行为case1@Vijay学生乙:是的,这是一种方法。您还可以强制显式转换(见上文)以消除错误,但改为运行到UBcase1@Vijay是的,这是一种方法。您还可以强制执行显式转换(见上文)以消除错误,但改为运行UB。