函数实参计算顺序

it2022-05-05  82

  今天在网上看到一道选择题

有函数调用语句: func(rec1,rec2+rec3,(rec4,rec5)); 此语句的实参数为(?) A、3 B、4 C、5 D、有语法错误

根据这道题,我今天想记录两个知识点:一、逗号表达式(或者称逗号运算符),二、函数实参计算顺序

逗号表达式

最右边的(rec4,rec5)是逗号表达式,只能算作一个参数,其值为rec5。 关于逗号运算符的介绍,以下内容来源于百度词条: c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14;a=(a=35,a4)的值是60,其中(a=35,a4)的值是60, a的值在逗号表达式里一直是15,最后被逗号表达式赋值为60,a的值最终为60。 这个内容比较简单,这里不再介绍了。

函数实参计算顺序

举个例子,如果有以下代码:

func(int a,int b,int c) {} int main() { int a = 1; int b = 2; int c = 3; func(a+=5.b+=a,c+=a); printf("%d %d %d\r\n",a,b,c); }

那么运行结果是什么呢? 我采用了两种不同的编译器进行了试验。 在linux下的gcc运行结果如下图:

而在Mac的gcc运行结果如下图:

明显看出来两个不一样,一个是从左往右算,而另一个是从右往左算。其实在C++标准里并没有明确规定函数实参的计算顺序,所以不同编译器采取的计算方式也是不一样的,这里出现两种不同的结果也是正常的。但是入栈顺序是确定的,其顺序是从右往左,大家不要记混了哦。   今天收获满满,虽然知识点不是很多,但是重在坚持和积累!希望明天能够继续!


最新回复(0)