回复 6楼 zghnxzdcx
你看不懂,但学过C或C++的别人看得懂
num+func(--num) 这个表达式属于“未定义行为”,就这么简单,有什么看不懂的呢?哦,我猜估计是不知道什么叫“未定义行为”,其它语言中确实没这概念。
程序代码:
#include <cstdio>
int func( int num )
{
return num;
}
int main( void )
{
int num = 0;
int val = num+func(--num); // ------ 违反了“修改之后只许读一次”的限定
printf( "%d\n", val );
}
无论是g++,还是clang,在编译时都会警告 num+func(--num) 这一句属于“未定义行为”
g++说的是 operation on 'num' may be undefined
clang说的是 unsequenced modification and access to 'num'
输出结果也各不相同,当然了,既然是“未定义行为”,那任何结果都没有意义。
BTW: 给有兴趣学C/C++的人介绍一下C/C++中的三种需要注意的行为
实现定义(implementation-defined)行为:
比如 char是有符合还是无符号,不同的编译器的行为不一样。
未指定(unspecified)行为:
比如 fun(a,b) 中是先求解a表达式还是b表达式,即使是同一个编译器,都可能各处不一样。
未定义(undefined)行为:
比如 ++i + ++i,编译器完全不认为有人会写出这样的代码,因此也从不考虑出现这种代码的可能。
gcc曾经就搞怪过一次,一旦代码中出现这种行为,就自动开启某个游戏。这样做是符合C/C++标准的。
总结一下:
实现定义行为:不同的编译器的行为不一样,但在同一个编译器中,可以保证一致。
未指定行为:在同一个编译器中都不能保证一致,但不管结果对错,起码有一个确定的结果。
未定义行为:连一个确定的结果都不能保证,可能输出一个错误的结果,也可能直接格式化掉你的硬盘。