0

次のプログラムを実行すると、出力が 1.00000 になります。しかし、私の疑問は、その機能がどのように機能するかということです? その動作についてはよくわかりません。以下のコードの作業プロセスを教えてください

float avg(float,float,float);

int main() 
{ 
    float p=1,q=2,r=-2,a;
    a=avg(p,(q=4,r=-12,q),r); 
    printf("%f",a); 
    return 0; 
} 

float avg(float x,float y,float z) 
{
    return (x+y+z)/3; 
}
4

3 に答える 3

8

関数呼び出し内に関数呼び出しはありません。

の、

a=avg(p,(q=4,r=-12,q),r); 

コード:

(q=4,r=-12,q)

を割り当てq = 4、 2 番目の引数としてr = -12渡しqます。これについては後で[注:1]

関数への引数の評価順序はUnspecifiedであることに注意してください。
つまり、引数を順番に関数に渡すことができます。

  • ケース 1:左から右または
  • ケース 2:右から左または
  • ケース 3:コンパイラが望む任意の魔法の順序 (もちろん、これは引数の数が 2 を超える場合にのみ可能です)

あなたの例では、コンパイラが選択した場合:

  • ケース 1の場合、出力は次のようになります。-2.....
  • ケース 2の場合、出力は になります1
  • ケース3の場合、出力は魔法のようになります

コード例からわかるように、副作用を生成するようなコードを記述しないことをお勧めします。


[注:1]

式のコンマ operator( ,) の意味:

(e1,e2,e3)

は:

部分式を評価しe1、次に評価e2してから評価しe3ます。式の値は の値ですe3

于 2012-12-11T05:30:53.650 に答える
1

x+y+z = 3 の場合、出力として 1 を取得できます。x が 1 であることはわかっているため、y+z = 2 です。これは、q = 4 および r = -2 の場合に可能です。評価順序は定義されていないため、コンパイラは引数を右から左に評価していると結論付けることができます。

于 2012-12-11T05:58:21.937 に答える
0

コンパイラの警告が表示されていませんか? そうでない場合は、有効に-Wallします (gcc コンパイラ用)。

a=avg(p,(q=4,r=-12,q),r);

この関数呼び出しの最初の引数は、関数が定義されているように、型float (float,float,float)NOTです。floatコンパイラの警告が表示されるはずです。

最初の引数は関数へのポインタavgです。関数呼び出しはありません。

于 2012-12-11T05:50:15.567 に答える