呼び出し前にpの値が が5に初期化されている場合、f(p、p)の戻り値は何ですか?最初のパラメータは であり、2番目のパラメータは値渡しであることに注意してください。与えられたコードでは未定義の動作ですか?
int f (int &x, int c) { c = c - 1; if (c==0) return 1; x = x + 1; return f(x,c) * x; }
オプションは次のとおりです。
私が説明しよう:このコードで
、4つの再帰的なパラメータを持つコール(6,4)、(7,3)、(8,2)と(9,1)が存在します。最後の呼び出しは1を返します。しかし、参照渡しにより、前のすべての関数のxは9になります。したがって、f(p、p)によって返される値は9 * 9 * 9 * 9 * 1 = 6561になります。
この質問は競争試験GATE(see Q.no.-42)からのものです。答えキーはGATEの "すべてにマークする"(正しいオプションがないことを意味します)key set-C, Q.no.-42です。どこかに説明されています:
GATE 2013では、C/C++の同じコードがすべて未定義の動作を生成するため、マークが付けられました。これは、*
がC/C++のシーケンスポイントではないためです。正しいコードは
res = f(x,c);
return res * x;
で
return f(x,c) * x;
を交換する必要がありますが、与えられたコードが正常に動作します。ゲートの鍵は間違っていますか?それとも本当に間違いですか?
あなたが両方の方法を見ずに通りを渡ると起こることの1つは、相手側に安全に行うことです。しかし、両道を見ずに通りを横切る人が安全に反対側にそれを作ることを*予測することは誤りです。 –
[Sequence Point ambiguity、Undefined behavior?](http://stackoverflow.com/q/29513572/1708801)と似ています –