2

当我用谷歌搜索这个时,我总是得到关于评估顺序的线程,一般来说,评估顺序是未指定的。

我知道参数评估顺序通常是未指定的C

我的问题是参数评估顺序是gcc从左到右还是从右到左?

任何资源链接也将不胜感激......

编辑:消除问题中的歧义

好吧,我说的是当时的情况

       foo(1+2,2+3,4+9)

哪个首先被评估?

是它1+2还是4+9......明智的......

我们可以通过在一个 gcc 编译器中编译它来进行声明吗....?或者不同的gcc版本也不同?

4

6 回答 6

7

如果您真的要问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)); 
于 2013-06-04T17:18:24.333 回答
2
#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
于 2013-06-26T11:19:41.707 回答
0

我认为您将两个概念混为一谈:1)参数评估的顺序(在函数调用中)和参数推送的顺序。首先,未指定(取决于实现)在传递给函数之前评估哪些顺序参数。其次,它取决于函数的调用约定,cdecl 将参数从右推到左,几乎所有其他约定(例如,pascal)从左推到右。

于 2013-06-04T16:34:35.680 回答
0

在 C 中,参数传递机制是基于堆栈的,这意味着它使用堆栈(称为:函数堆栈框架)来存储参数,因此顺序是正确的,因为堆栈是 LIFO 。这取决于我的理解。请看一下这个链接,它会为你解释更多,我希望你能找到一些有用的东西 http://zoo.cs.yale.edu/classes/cs427/2012a/resources/Chapter_05.pdf

pg#55 , 5.2.3 参数传递机制

于 2013-06-04T17:44:37.637 回答
0

C++ 中没有从左到右或从右到左求值的概念,不要与运算符的从左到右和从右到左结合性混淆:表达式 f1() + f2( ) + f3() 被解析为 (f1() + f2()) + f3() 由于 operator+ 的从左到右的关联性,但是对 f3 的函数调用可能首先计算,最后计算,或在 f1() 之间计算或 f2() 在运行时。

于 2013-06-04T16:37:17.643 回答
0
// 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());
}
于 2014-12-11T13:07:28.163 回答