C言語の関数引数はどのような順序で評価される?
関数引数の評価順序とは?
プログラミングでは、関数にさまざまな引数を渡します。その際、「関数の引数はどのような順序で評価されるのだろう?」という疑問が浮かぶことがあります。左から右へ評価されるのでしょうか、それとも右から左へなのでしょうか。
ここでは、簡単なサンプルプログラムを使って評価順序を確認してみます。複数の引数を関数に渡し、その出力結果から実際の評価順序を読み解いていきましょう。
サンプルコード
#include<stdio.h>
void test_function(int x, int y, int z) {
printf("The value of x: %d\n", x);
printf("The value of y: %d\n", y);
printf("The value of z: %d\n", z);
}
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言語の標準規格(ISO C)では、関数引数の評価順序は明確には定められていません。これは「未規定動作」と呼ばれるものです。上記のように右から左へ評価されるのは、GCCなど多くの一般的なコンパイラでよく見られる典型的な挙動ですが、すべてのコンパイラや環境で同じ結果が保証されるわけではありません。
そのため、a++ のような副作用を伴う式を引数として渡す書き方は避けるべきです。移植性の高い安全なプログラムを書くためには、引数同士が互いに依存しないようにし、評価順序に依存しない設計を心がけましょう。
-
JavaScriptの関数パラメーターとは?使い方をサンプルコードで解説
JavaScriptでは、関数を呼び出すときにさまざまなパラメーター(引数)を渡すことができます。関数側では、渡されたパラメーターを受け取り、それに対して任意の処理を実行することが可能です。また、1つの関数は複数のパラメーターを受け取ることができ、それぞれのパラメーターはカンマ(,)で区切って指定します。さらに、JavaScriptには arguments オブジェクトが用意されており、仮引数として宣言した変数とは別に、実際に関数へ渡されたすべての引数へアクセスできます。以下のサンプルコードでは、Array.from(arguments) を使って受け取った引数を配列化し、順番に画面へ出力して
-
C言語のstrcmp()関数とは?文字列比較の基本と使い方を徹底解説
C言語の標準ライブラリ関数 int strcmp(const char *str1, const char *str2) は、ポインタ str1 が指し示す文字列と、str2 が指し示す文字列を比較するための関数です。C言語において、文字型の配列は「文字列」と呼ばれます。まずは文字列の基本的な扱い方から確認していきましょう。文字列の宣言文字列(文字配列)の宣言は以下のように行います。char stringname [size];例えば、char string[50]; と宣言すれば、最大50文字の長さを持つ文字列を格納できます。文字列の初期化文字列の初期化には、主に次の2つの方法があります。1