C和C++中未定义,未指定和实现定义的行为有什么区别?
c c++ undefined-behavior unspecified-behavior implementation-defined-behavior
我是C的完全新手,在我的大学工作期间,我遇到了代码中的注释,这些注释通常指的是取消引用NULL指针.我有在C#中的背景下,我已经得到通过,这可能是类似于"的NullReferenceException"你是在净得到的,但现在我有严重的怀疑.
有人可以用非专业人员的术语向我解释这是什么以及它为什么不好?
以下代码在我的系统上产生奇怪的东西:
#include <stdio.h>
void f (int x) {
int y = x + x;
int v = !y;
if (x == (1 << 31))
printf ("y: %d, !y: %d\n", y, !y);
}
int main () {
f (1 << 31);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译-O1,这打印y: 0, !y: 0.
现在,除了删除int v或if行产生预期结果的令人费解的事实之外,我对溢出转换为逻辑不一致的未定义行为感到不舒服。
这应该被认为是一个错误,还是 GCC 团队的理念是,一个意外的行为可以级联成逻辑矛盾?