zoukankan      html  css  js  c++  java
  • 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;
     

    位运算:

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

    指针比较:

    任意的毫无关联的两个指针进行比较是毫无 意义的。指向同一个数组的两个指针可以进行比较。
  • 相关阅读:
    matlab2016b
    【ccf- csp201509-4】高速公路
    【ccf- csp201412-2】z字形扫描
    【ccf-csp201512-5】矩阵
    【动态规划】矩阵连乘分析
    JAVA环境搭建
    【离散数学2】代数系统趣题
    给文本编辑框绑定变量
    清空文本框SetDlgItemText(IDC_TXTXT,NULL);
    有关SetTimer函数的用法
  • 原文地址:https://www.cnblogs.com/Przz/p/6413357.html
Copyright © 2011-2022 走看看