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;
 

位运算:

如果对象是带符号的,那么位运算如何处理符号位依赖于机器,而且此时左移可能改变符号位,一次是一种未定义行为。
//强烈建议位运算用于处理无符号位
 

指针比较:

任意的毫无关联的两个指针进行比较是毫无 意义的。指向同一个数组的两个指针可以进行比较。
原文地址:https://www.cnblogs.com/Przz/p/6413357.html