zoukankan      html  css  js  c++  java
  • C++ 中表达式求值

    首先我们来看一段代码:
    int a() { return std::puts("a"); }
    int b() { return std::puts("b"); }
    int c() { return std::puts("c"); }
    void z(int, int, int) {}
    int main() {
        z(a(), b(), c());       // 允许全部 6 种输出排列
        return a() + b() + c(); // 允许全部 6 种输出排列
    }
    
    

    这段代码是cppreference网站中对与表达式求值顺序,做的一个引入介绍。这个代码中说的就是对于表达式求值顺序规则:若某个函数调用既不按顺序早于又不按顺序晚于另一函数调用,则它们是顺序不确定。

    这段代码的输出结果可能为:

    a
    b
    c
    a
    b
    c
    //或者
    b
    a
    c
    a
    c
    b
    //其实顺序完全不确定,进行排列组合会有多种输出顺序。
    
    平时求值顺序不确定的情况,主要有以下四种:

    1、若某个函数调用既不按顺序早于又不按顺序晚于另一函数调用,则它们是顺序不确定的

    2、对分配函数(operator new)的调用相对于 new 表达式中构造函数参数的求值来说,是顺序不确定的(c++17后先构造后分配)

    3、函数调用表达式中,每个形参的初始化的值计算和副作用相对于任何其他形参的初始化的值计算和副作用是顺序不确定的。

    4、带括号的初始化器中的逗号分隔的表达式列表中的每个表达式,如同函数调用一般求值(顺序不确定)。

  • 相关阅读:
    Gvim快捷键学习
    一步一步学习Vim 全图解释
    经典vim插件功能说明、安装方法和使用方法介绍
    中国数学数字图书馆
    RQNOJ第一题---PID1 / 明明的随机数
    gdb常用命令
    linux c下mysql编程样例
    linux c编程 -- 线程互斥
    linux c多线程编程范例
    数据结构 -- 可重用模块的接口设计模板
  • 原文地址:https://www.cnblogs.com/Smarc/p/13791816.html
Copyright © 2011-2022 走看看