C语⾔中的未定义⾏为(UndefinedBehavior)
C语⾔中的未定义⾏为(Undefined Behavior)
C语⾔中的未定义⾏为(Undefined Behavior)是指C语⾔标准未做规定的⾏为。同时,标准也从没要求编译器判断未定义⾏为,所以这些⾏为有编译器⾃⾏处理,在不同的编译器可能会产⽣不同的结果,⼜或者如果程序调⽤未定义的⾏为,可能会成功编译,甚⾄⼀开始运⾏时没有错误,只会在另⼀个系统上,甚⾄是在另⼀个⽇期运⾏失败。当⼀个未定义⾏为的实例发⽣时,正如语⾔标准所说,“什么事情都可能发⽣”,也许什么都没有发⽣。
所以,避免未定义⾏为,是个明智的决定。本⽂将介绍⼏种未定义⾏为,同时欢迎读者纠错和补充。
1.同⼀运算符中多个操作数的计算顺序(&&、||、?和,运算符除外)
例如:
x =f()+g();//错误
c语言中逗号表达式的用法f()和g()谁先计算由编译器决定,如果函数f或g改变了另⼀个函数所使⽤变量的值,那么x的结果可能依赖于这两个函数的计算顺序。
参考: 《C程序设计语⾔(第2版)》 P43
2.函数各参数的求值顺序
例如:
printf("%d,%d\n",++n,power(2,n));//错误
在不同的编译器可能产⽣不同的结果,这取决于n的⾃增运算和power调⽤谁在前谁在后。
需要注意的是,不要和逗号表达式弄混,都好表达式可以参考这篇⽂章:c语⾔中逗号运算符和逗号表达式
参考: 《C程序设计语⾔(第2版)》 P43
3.通过指针直接修改 const 常量的值
直接通过赋值修改const变量的值,编译器会报错,但通过指针修改则不会,例如:
int main ()
{
const int a =1;
int* b =(int*)& a ;
* b =21;
printf ("%d, %d", a ,* b );
return0;
}
a输出值也由编译器决定。