C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++における関数引数の評価順序をわかりやすく解説

C++では、関数にさまざまな引数を渡すことができます。その際、「関数の引数はどのような順序で評価されるのだろうか」という疑問が浮かぶことがあります。左から右へ評価されるのでしょうか、それとも右から左へなのでしょうか。

本記事では、シンプルなプログラムを使って引数の評価順序を実際に確認します。複数の引数を関数に渡し、その出力結果から評価の流れを読み解いていきましょう。

サンプルプログラム

#include<iostream>
using namespace std;
void test_function(int x, int y, int z) {
   cout << "The value of x: " << x << endl;
   cout << "The value of y: " << y << endl;
   cout << "The value of z: " << z << endl;
}
main() {
   int a = 10;
   test_function(a++, a++, a++);
}

実行結果

The value of x: 12
The value of y: 11
The value of z: 10

結果の解説

この出力結果から、引数の評価順序を容易に読み取ることができます。まず最も右側にある z が評価され、インクリメント前の値 10 を受け取ります。次に中央の y が評価され、11 となります。そして最後に左側の x が評価され、12 を受け取ります。

つまり、この環境では引数が右から左への順序で評価されていることが分かります。

注意点:評価順序は未規定

C++の標準規格では、関数引数の評価順序は未規定(unspecified)とされています。そのため、コンパイラによって評価順序が異なる場合があり、上記の結果はあくまで特定の環境での一例です。なお、多くの一般的なコンパイラでは右から左へ評価される傾向があります。

a++ のような副作用(変数の値を変更する操作)を伴う式を引数として渡すと、コンパイラごとに結果が変わる可能性があります。実務では、評価順序に依存しないコードを心がけることが、移植性の高いプログラムを書くための重要なポイントとなります。

  1. C++のlog1p()関数とは?使い方とサンプルコードをわかりやすく解説

    C++のlog1p()関数の概要C++のlog1p()関数は、任意の数値 a に対して「(a + 1) の自然対数(底が e の対数)」を計算するための関数です。戻り値として (a+1) の自然対数の値が返されます。なお、引数に -1 未満の値 を渡した場合は、有効な結果が得られないため NaN(Not a Number) が返される点に注意が必要です。数学的な表現log1p() の動作は、次の数式で表すことができます。log1p(a) = base-e log(a+1)log1p()の構文C++における log1p() 関数の構文は以下のとおりです。float log1p(float var

  2. C++のswap()関数とは?2つの変数の値を入れ替える方法をサンプルコード付きで解説

    swap()関数とは C++のswap()関数は、2つの値を入れ替える(交換する)ための関数です。この関数を利用すれば、一時的な第三の変数を自分で用意することなく、2つの変数の値を簡単に入れ替えることができます。 swap()関数の構文 void swap(int variable_name1, int variable_name2); 変数に値を代入してswap()関数に渡した場合、関数内では値の入れ替えが行われますが、呼び出し元の実際の変数の値は変わりません。これは、引数が「値渡し」で渡されるためです。実際の変数の値を入れ替えたい場合は、後述する「参照渡し」を使用します。 例1:s