C言語で関数を呼び出す前のパラメータ評価順序 質問する

C言語で関数を呼び出す前のパラメータ評価順序 質問する

C で関数を呼び出すときに、関数パラメータの評価順序を想定できますか? 以下のプログラムによると、実行したときに特に順序はないようです。

#include <stdio.h>

int main()
{
   int a[] = {1, 2, 3};
   int * pa; 

   pa = &a[0];
   printf("a[0] = %d\ta[1] = %d\ta[2] = %d\n",*(pa), *(pa++),*(++pa));
   /* Result: a[0] = 3  a[1] = 2    a[2] = 2 */

   pa = &a[0];
   printf("a[0] = %d\ta[1] = %d\ta[2] = %d\n",*(pa++),*(pa),*(++pa));
   /* Result: a[0] = 2  a[1] = 2     a[2] = 2 */

   pa = &a[0];
   printf("a[0] = %d\ta[1] = %d\ta[2] = %d\n",*(pa++),*(++pa), *(pa));
   /* a[0] = 2  a[1] = 2 a[2] = 1 */

}

ベストアンサー1

いいえ、C では関数パラメータは定義された順序で評価されません。

マーティン・ヨークの回答を見るC++ プログラマーが知っておくべき一般的な未定義の動作は何ですか?

おすすめ記事