c++中函数参数的求值顺序

c++中如果函数的参数列表包含多个实参,那么对参数的求值顺序是不确定的。

在谭浩强的《C++程序设计》(第二版)P94中提到,GCC对参数求值是按从右到左的顺序求值的。 但我实测并非如此。

#include <iostream>
#include <iomanip>
using namespace std;

void test(int x, int y) {
    cout << ‘x‘ << x << " y" << y << endl;
}

int main() {

    int i = 3;
    test(i, i++);
    i = 3;
    test(i, ++i);
    i = 3;
    test(i++, i);
    i = 3;
    test(++i, i);

    return 0;
}

这段程序的输出为:

x4 y3
x4 y4
x3 y4
x4 y4

  由此可见,哪怕是对于同一编译器,参数的求值顺序也是不确定的。

在实际使用中,要尽量避免一个语句中包含多个表达式的情况,或者保证多个表达式之间不存在互相影响结果的情况。

时间: 2024-08-02 10:43:32

c++中函数参数的求值顺序的相关文章

C语言中函数参数入栈的顺序 - Fangzhen - 博客园

.wiz-todo, .wiz-todo-img {width: 16px; height: 16px; cursor: default; padding: 0 10px 0 2px; vertical-align: -10%;-webkit-user-select: none;} .wiz-todo-label { display: inline-block; padding-top: 7px; padding-bottom: 6px; line-height: 1.5;} .wiz-todo

php与js中函数参数的默认值设置

php函数参数默认值设置: <?phpfunction test($val=3){   echo $val."<br/>";}test(11);test();?> javascript函数参数默认值设置function test(){alert("test函数");} function test2(val,func){ val=val||"";//利用js中的或操作,第一个参数值为false(为空)时返回第二个参数的值.第

Golang语句中的求值顺序

在Go specs中,有这样三点陈述: 1.变量声明(variable declaration)中的初始化表达式(initialization expressions)的求值顺序(evaluation order)由初始化依赖(initialization dependencies)决定:但对于初始化表达式内部的操作数的求值需要按照2中的顺序:从左到右: 2.在非变量初始化语句中,对表达式.赋值语句或返回语句中的操作数进行求值时,操作数中包含的函数(function)调用.方法(method)调

C++求值顺序

<C++Primer5th>中文版第124页 C++语言没有明确规定大多数二元运算符的求值顺序, 给编译器优化留下了余地. 这种策略实际上是在代码生成效率和程序潜在缺陷之间进行了权衡,这个是否可以接受? 1.首先可以知道优先级规定了运算对象的组合方式,但是没有说明运算对象按照什么顺序求值. 比如: int i=f1()*f2(); 在这里虽然f1和f2在乘法之前被调用,但是f1先调用还是f2先调用却不得而知. 2.再比如结合律: -- int i=0; cout<<i<<

条件表达式的短路求值与函数的延迟求值

延迟求值是 .NET的一个很重要的特性,在LISP语言,这个特性是依靠宏来完成的,在C,C++,可以通过函数指针来完成,而在.NET,它是靠委托来完成的.如果不明白什么是延迟求值的同学,我们先看看下面的一段代码: static void TestDelayFunction() { TestDelayFunton1(true,trueFun3); } static void TestDelayFunton1(bool flag , Func<bool> fun ) { if(flag) fun(

函数参数,返回值,递归函数

函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形式 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值 定义函数时,是否接收参数,或者是否返回结果,是根据 实际的功能需求 来决定的! 如果函数 内部处理的数据不确定,就可以将外界的数据以参数传递到函数内部 如果希望一个函数 执行完成后,向外界汇报执行结果,就可以增加函数的返回值

C之旅(一)运算符——优先级,结合性和求值顺序

本节主要讲基本运算符的优先级,结合性和求值顺序.先看一个表达式- (1 + 2) * 3 + (4 + 5 * (6 + 7 ))记住你对它的运算过程,看完下面的内容之后,也许你会用不同的方式来看待这个表达式. 基本运算符 = + - * / C中没有指数运算.运算符操作的是操作数,操作数就是放在运算符两侧的东西. (1) 赋值运算符 = year = 2016; 读作将值2016赋给year,而非year等于2016.=将2016赋给变量year,是从右到左的,即=具有右结合性.2016 =

c++函数参数类型-值,指针,引用

    以" 值传递"方式向函数传递参数 在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以值传递的方式传递给函数.这句话的意思是:被传递到函数的只是变量的值,永远不是变量的本身. 例如: void changeValue(int originalValue,int newValue){     originalValue = newValue;   }      int main(){     int myNum=20;     changeV

指针作为函数参数,修改实参值

1,指针作为函数参数, 指针可以指向内存中任意一个数据,通过间接引用能够在函数内修改函数外甚至系统中的数据; 为了避免指针作为函数参数导致数据被意外修改,我们可以使用const来保护指针所指向的数据; 2,指针作为函数返回值, 同别的数据类型int,float一样,指针也能够作为函数的一种返回值类型,把返回指针的函数称为指针函数; 返回的指针所指向的数据不能够是函数内部声明的变量; 更灵活的存储,使用数组的时候面临种尴尬:数组的存储空间必须在程序运行前申请,即数组的大小在编译前必须是已知的常量表