C++Primer学习——未定义行为
定义:
主要是求值顺序的问题
int i = f1() + f2(); //我们无法知道是f1 还是 f2先被调用
而且求值顺序和优先级和结合律无关,比如:
f() + g()*h() + j()
优先级:g()的返回值和h()的返回值相乘。 但是并没确定调用顺序
for(auto it = begin(arry);it != end(arry);it ++ ){} auto it = begin(arry); while (it != end(arry)) { *it = toupper(*it++); /* 是未定义行为(两端都用到了而且右端还改变了它的值),因为你无法知道是先计算的左边还是右边 *it = toupper(*it) or *(it+1) = toupper(*it) */ }
4种规定了的求值顺序:
1.&&先求左边再求右边(要求左边先为真)---> a&&b
2.|| ---> a||b
3.?:---> a > b ? a:b;
4., ---> int a = 110,&b = a;
位运算:
如果对象是带符号的,那么位运算如何处理符号位依赖于机器,而且此时左移可能改变符号位,一次是一种未定义行为。
//强烈建议位运算用于处理无符号位
指针比较:
任意的毫无关联的两个指针进行比较是毫无 意义的。指向同一个数组的两个指针可以进行比较。