根据此代码:
int main(){
int x=1;
int y=2;
printf(" %s + %s = %s ", function(x) , function(y), function(x+y));
}
char* function(int num){
static char B[20];
sprintf(B,"%d",num);
return B;
}
我得到的答案是:1 +1 = 1
问题是为什么?
为什么要这样分隔行:
int main(){
int x=1;
int y=2;
printf("%s +" function(x));
printf(" %s =" function(y));
printf(" %s"function(x+y));
}
我得到了我期望的正确答案?
答案 0 :(得分:3)
由于只有一个缓冲区B
,因此每次函数调用都会覆盖它。由于您在printf
中进行的main
调用会调用函数3次,因此sprintf
会找到3次相同的缓冲区。而且,不能保证在函数参数的求值中调用函数的顺序。
答案 1 :(得分:3)
函数function
始终返回相同的值,即指向静态数组B
开头的指针。
在第一个代码段中,作为对funtion
的调用的一部分,您多次调用printf
。调用函数时,必须在调用函数之前评估其每个参数。这意味着function
在调用printf
之前被调用了3次,因此B
仅包含在那里存储的最新值。这意味着您最终会打印3次相同的内容。
此外,函数的参数计算顺序不确定,因此您不会对function
的调用是最后一个。打印三次的值可以是1、2或3。
在第二个代码段中,由于您在每个function
调用中只调用一次printf
,所以对于要打印的内容没有任何歧义。