当我用谷歌搜索这个时,我总是得到关于评估顺序的线程,一般来说,评估顺序是未指定的。
我知道参数评估顺序通常是未指定的C。
我的问题是参数评估顺序是gcc从左到右还是从右到左?
任何资源链接也将不胜感激......
编辑:消除问题中的歧义
好吧,我说的是当时的情况
foo(1+2,2+3,4+9)
哪个首先被评估?
是它1+2还是4+9......明智的......
我们可以通过在一个 gcc 编译器中编译它来进行声明吗....?或者不同的gcc版本也不同?
当我用谷歌搜索这个时,我总是得到关于评估顺序的线程,一般来说,评估顺序是未指定的。
我知道参数评估顺序通常是未指定的C。
我的问题是参数评估顺序是gcc从左到右还是从右到左?
任何资源链接也将不胜感激......
编辑:消除问题中的歧义
好吧,我说的是当时的情况
foo(1+2,2+3,4+9)
哪个首先被评估?
是它1+2还是4+9......明智的......
我们可以通过在一个 gcc 编译器中编译它来进行声明吗....?或者不同的gcc版本也不同?
如果您真的要问foo(f1(), f2(), f3())- 哪个比 更有趣foo(1+2, 3+4, 5+6),因为添加 1+2 和 3+4 无论是先完成还是最后完成还是以随机顺序完成都不会产生影响。
现在,不幸的是,您不能依赖f1()andf2()并f3()以任何特定的顺序被调用 - 只要每个函数都被调用一次,那么顺序是任何顺序都可以:
f1, f2, f3
f1, f3, f2
f2, f3, f1
f2, f1, f3
f3, f2, f1
f3, f1, f2
(涵盖了三个参数的所有排列)。
这完全取决于它“认为最好”的编译器。
我很久以前写了一些代码,遇到了这个特殊的问题——我有一些类似的东西:
char foo(char a, char b)
...
if (a =! 'x')
foo(fgetc(f), foo(fgetc(f)));
...
由于我希望fgetc()首先调用 FIRST (左),然后调用第二个fgetc(),因此我可以获得正确的行为。它在学校计算机上运行良好。然后我把代码带回家并尝试在我的家用电脑上使用它。由于某种原因,它不能正常工作。我花了很长时间才弄清楚这foo()只是被无限调用,因为awas never 'x',它停止了递归 - 因为'x'永远不会出现在第二次调用中。
那是在两台机器上使用 gcc,但是一台是 sparc(学校计算机),而家里的一台是 x86(386,运行 OS/2,那是很久以前的事了)。
解决方案是将其分成几行:
char aa = fgetc(f);
char bb = fgetc(f);
foo(aa, foo(bb));
#include <stdio.h>
int f1(void){
printf("In F1\n");
return 0;
}
int f2(void){
printf("In F2\n");
return 0;
}
int f3(void ){
printf("In F3\n");
return 0;
}
void f4(int a,int b,int c){
printf("In F4\n");
return;
}
int main(){
f4(f1(),f2(),f3());
getch();
return 0;
}
output
----------
In F3
In F2
In F1
In F4
but for
printf("%d..%d..%d",(f1(),f2(),f3()));
output
---------
In F1
In F2
In F3
0..0..0
我认为您将两个概念混为一谈:1)参数评估的顺序(在函数调用中)和参数推送的顺序。首先,未指定(取决于实现)在传递给函数之前评估哪些顺序参数。其次,它取决于函数的调用约定,cdecl 将参数从右推到左,几乎所有其他约定(例如,pascal)从左推到右。
在 C 中,参数传递机制是基于堆栈的,这意味着它使用堆栈(称为:函数堆栈框架)来存储参数,因此顺序是正确的,因为堆栈是 LIFO 。这取决于我的理解。请看一下这个链接,它会为你解释更多,我希望你能找到一些有用的东西 http://zoo.cs.yale.edu/classes/cs427/2012a/resources/Chapter_05.pdf
pg#55 , 5.2.3 参数传递机制
C++ 中没有从左到右或从右到左求值的概念,不要与运算符的从左到右和从右到左结合性混淆:表达式 f1() + f2( ) + f3() 被解析为 (f1() + f2()) + f3() 由于 operator+ 的从左到右的关联性,但是对 f3 的函数调用可能首先计算,最后计算,或在 f1() 之间计算或 f2() 在运行时。
// according to my tests: left to right for clang-3.4 and right to left
// for gcc-4.8.2
// but don't write any code relying on that: it would be highly unportable
#include <stdio.h>
int one() {
printf("1\n");
fflush(stdout);
return 1;
}
int two() {
printf("2\n");
fflush(stdout);
return 1;
}
int three() {
printf("3\n");
fflush(stdout);
return 1;
}
void test(int a, int b, int c) {
return;
}
int main() {
test(one(), two(), three());
}