C和C++中未定义,未指定和实现定义的行为有什么区别?
c c++ undefined-behavior unspecified-behavior implementation-defined-behavior
#include <stdio.h>
int main()
{
const int a = 12;
int *p;
p = &a;
*p = 70;
}
Run Code Online (Sandbox Code Playgroud)
它会起作用吗?
这不是学术准则或假设性问题.最初的问题是将代码从HP11转换为HP1123 Itanium.基本上它归结为HP1123 Itanium上的编译错误.在Windows上进行复制时,我真的很抓头.除了最基本的方面之外我已经删除了......如果按原样运行,可能必须按控制D退出控制台窗口:
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char blah[6];
const int IAMCONST = 3;
int *pTOCONST;
pTOCONST = (int *) &IAMCONST;
(*pTOCONST) = 7;
printf("IAMCONST %d \n",IAMCONST);
printf("WHATISPOINTEDAT %d \n",(*pTOCONST));
printf("Address of IAMCONST %x pTOCONST %x\n",&IAMCONST, (pTOCONST));
cin >> blah;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输出
IAMCONST 3
WHATISPOINTEDAT 7
Address of IAMCONST 35f9f0 pTOCONST 35f9f0
Run Code Online (Sandbox Code Playgroud)
我只能说是什么?这样做是不明确的?对于这样一个简单的例子,这是我见过的最违反直觉的事情.
更新:
确实在搜索了一段时间后,菜单调试>> Windows >>反汇编完全具有下面描述的优化.
printf("IAMCONST %d \n",IAMCONST);
0024360E mov esi,esp
00243610 push 3
00243612 push offset …Run Code Online (Sandbox Code Playgroud) 我在代码中写了一些类似的东西
const int x=1;
int *ptr;
ptr = &x;
*ptr = 2;
Run Code Online (Sandbox Code Playgroud)
这适用于所有编译器吗?为什么GCC编译器没有注意到我们正在改变一个常量变量?
对不起,我不太善于解释问题.所以我直接从例子开始
请看下面的例子
const int a=10;
int *ptr;
int main(){
ptr=&a;
*ptr=100; // program crashes
printf("%d",a);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在上面的代码中稍作修改,如下所示
const int a; // uninitialized global variable
Run Code Online (Sandbox Code Playgroud)
那么上面的代码工作正常.
所以我的问题是为什么编译器对uninitialize和初始化全局const变量的行为不同?
我正在使用gcc for windows(mingw).
以下程序的输出在gcc上为50.怎么可能因为x是常量变量而*p是x本身,因为p是指向x处的值的常量指针.turbo c给编译器错误的地方.这是一个未定义的行为吗?请解释.
#include<stdio.h>
int main()
{
const int x = 25;
int * const p = &x;
*p = 2 * x;
printf("%d", x);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 运行以下代码显示&x = ptr,那么x和*ptr怎么不相等?
const int x=10;
int* ptr =(int*) &x;
*ptr = (*ptr)+1;
cout << &x << " " << x << " " << ptr <<" " <<*ptr; //output : 0012FF60 10 0012FF60 11
Run Code Online (Sandbox Code Playgroud)