2

私がこれをグーグルで検索したとき、評価の順序が指定されていないという一般的な評価の順序に関するスレッドを常に取得しました。

一般に、パラメーターの評価順序が指定されていないことは知っていますC

私の質問はgcc、左から右または右から左のパラメーター評価順序ですか?

リソースへのリンクも歓迎します...

編集:質問のあいまいさを取り除く

さて、私は状況について話している

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

どちらが最初に評価されますか?

それ1+24+9...賢明なように..

これを 1 つの gcc コンパイラでコンパイルするだけで宣言に到達できますか? それとも、異なるgccバージョンでも異なりますか?

4

6 に答える 6

7

1+2 と 3+4 を追加しても、最初か最後かランダムな順序で実行しても効果がないため、これfoo(f1(), f2(), f3())は よりも興味深いものです。foo(1+2, 3+4, 5+6)

残念ながら、f1()and とf2()andf3()が特定の順序で呼び出されることに依存することはできません。各関数が一度だけ呼び出される限り、順序はどのような順序でもかまいません。

   f1, f2, f3
   f1, f3, f2
   f2, f3, f1
   f2, f1, f3
   f3, f2, f1
   f3, f1, f2

(これは、3 つのパラメーターのすべての順列をカバーしています)。

それは完全に「最善と考える」コンパイラ次第です。

私はずっと前にいくつかのコードを書き、この特定の問題に遭遇しました-私は次の行に沿って何かを持っていました:

char foo(char a, char b)
 ... 
 if (a =! 'x')
   foo(fgetc(f), foo(fgetc(f))); 
 ...

FIRST (左)fgetc()が最初に呼び出され、2 番目が呼び出されると予想していたのでfgetc()、正しい動作を得ることができました。そして、学校のコンピューターで問題なく動作しました。次に、コードを家に持ち帰り、自宅のコンピューターで使用してみました。そして、何らかの理由でそれが正しく機能しませんでした。foo()が無限に呼び出されているaこと'x'を理解するのにかなりの時間がかかりました'x'

両方のマシンで gcc を使用していましたが、1 つは sparc (学校のコンピューター) で、自宅の 1 つは 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

Cでは、パラメータ受け渡しメカニズムはスタックベースであることを意味し、スタック(関数スタックフレームとして知られている)を使用してパラメータを格納します。したがって、スタックはLIFOであるため、順序は正しいです。それは私の理解次第でした。親切にこのリンクを見てください、それはあなたにもっと説明します、私はあなたが役に立つ何かを見つけることを願っています http://zoo.cs.yale.edu/classes/cs427/2012a/resources/Chapter_05.pdf

pg#555.2.3 パラメータ受け渡しメカニズム

于 2013-06-04T17:44:37.637 に答える