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);
}

我知道我可能错过了一些非常简单的东西。我只是不明白为什么 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)评估的:稍微违反直觉,您看不到该调用的副作用。但是如果您在通话后再次打印,您确实会看到它们。 testtest


底线,只是要小心有副作用的功能,你应该被设置。

于 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 回答