为什么在使用gcc和g ++编译时,以下代码会给出不同的结果?

Roh*_*han 3 c gcc const g++

#include<stdio.h>
int main()
{
    const int a=1;
    int *p=(int *)&a;
    (*p)++;
    printf("%d %d\n",*p,a);
    if(a==1)
      printf("No\n");//"No" in g++.
    else
      printf("Yes\n");//"Yes" in gcc.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码给出No如在输出g++汇编和Yesgcc编译.任何人都能解释一下这背后的原因吗?

jua*_*nza 10

您的代码会触发未定义的行为,因为您正在修改const对象(a).它不必产生任何特定的结果,即使在相同的平台上,也不必使用相同的编译器.

虽然没有指定此行为的确切机制,但您可以通过检查代码生成的程序集来弄清楚您的特定情况下发生了什么(您可以通过使用该-S标志来查看.)请注意,编译器是允许的通过假设代码具有良好定义的行为来进行积极的优化.例如,a可以简单地将其替换1为使用它的任何地方.


Vla*_*cow 6

来自C++标准(1.9程序执行)

4本国际标准中将某些其他操作描述为未定义(例如,尝试修改const对象的效果).[注意:本国际标准对包含未定义行为的程序的行为没有要求. - 尾注]

因此,您的程序具有未定义的行为.