2

以下の短いコードスニペットを実行しても、変数testの値が変更されない理由を誰かが説明できますか?

#include <stdio.h>

int f1(char * foo) {
    *foo = 'a';
    return 0;
}

void main(void) {
    char test = 'n';
    printf("f1(&test)=%d.  test's new value? : %c", f1(&test), test);
}

私はおそらく本当に単純なものが欠けていることを知っています。f1()でアドレスを渡したので、なぜテストが変更されないのかわかりませんよね?printf()の引数のリストで実際の関数呼び出しが発生することが重要なのはなぜですか?

次のように、printf引数リストからf1()の呼び出しを取得すると、次のようになります。

#include <stdio.h>

int f1(char * foo) {
    *foo = 'a';
    return 0;
}

void main(void) {
    char test='n';
    int i;
    i = f1(&test);
    printf("f1(&test)=%d.  test's new value? : %c", i, test);
}

物事は期待どおりに機能します。

前もって感謝します。

4

3 に答える 3

4

関数呼び出しへの引数が評価される順序は指定されていません。言い換えれば、いつf1(&test)評価されるかははっきりとはわかりません。

したがって、あなたの例では、おそらく次のようf1(&test)に評価さ testます:少し直感に反して、その呼び出しの副作用を確認することはできません。しかしtest、電話の後でもう一度印刷すると、実際にそれらが表示されます。


結論として、副作用のある機能に注意してください。設定する必要があります。

于 2012-07-24T19:39:18.730 に答える
2

関数パラメーターが評価される順序は決まっていません。あなたは、引数が左から右に評価されるという考えに頼っていますが、これは想定できません。

于 2012-07-24T19:40:43.553 に答える
0

関数呼び出しを行う場所を変更するだけです

#include <stdio.h>                  

int f1 (char* foo) {                
        *foo='a';                   
        return 0;                   
}                                   

int main(void)                      
{                                   
        char test='n';              
        f1(&test);                  
        printf("test=%c\n", test);  

        return 0;                   
}                                   
于 2012-07-24T19:44:23.033 に答える