1

サブルーチンの引数が評価される順序を決定するプログラムを C で作成しています。

私がこれまでに持っているものは次のとおりです。

int i=1;
printf("%d %d %d\n", i++, i++, i);

しかし、私が正しい道を進んでいるのか、それともRubyのような別の言語で書く方が簡単なのかはわかりません。

サブルーチン引数が評価される順序を決定するプログラムを C (または Ruby) で作成するにはどうすればよいですか?

4

2 に答える 2

4

printf () 関数の引数の評価順序は規定されていません。そのため、それらが評価される順序を移植可能に決定することはできません。それを決定したい場合は、評価の順序が明確に定義されている言語を選択することになるでしょう。

さらに、シーケンス ポイントを介在させずに複数回変更すると、コードの動作が未定義になります。i

于 2012-12-02T23:19:00.997 に答える
3

未定義の動作を呼び出さずにこれを行う方法は、各引数が評価されるときに単純にメッセージを出力することです:

#include <stdio.h>

static void foo(int a, int b, int c) {}

static int argument(int n)
{
    printf("Argument %d.\n", n);
    return n;
}

int main(void)
{
    foo(argument(0), argument(1), argument(2));
    return 0;
}

ただし、これは、プログラムの特定の 1 回の実行における引数評価の順序のみを示します。引数評価の順序は C 標準では指定されておらず、さまざまな理由で変更される可能性があります。たとえば、関数に単純な引数を渡す場合、コンパイラはそれらを最後から最初に評価する可能性があるため、そのプラットフォームでサブルーチンを呼び出すために必要な順序でスタックに簡単に配置できます。しかし、同じコンパイラ バージョンとコンパイル スイッチを使用して、いくつかの複雑な引数を関数に渡し、その一部に共通の部分式があるとします。コンパイラは、共通の部分式を利用するために、最初にこれらの引数を評価することを決定する場合があります。

コンパイラは、1 つの引数の一部を評価し、次に別の一部を評価し、次に最初の引数の一部を評価し、次に 3 番目の引数を評価し、関数呼び出しの前に式を評価し (シーケンス ポイントの動作が保持されている場合)、2 番目の引数を終了することもできます。

引数評価の順序は、信頼できるものではありません。

于 2012-12-02T23:52:01.227 に答える