根据以下代码:
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));
}
正如我所期望的那样,我得到了正确的答案???
该函数function
始终返回相同的值,即指向静态数组开头的指针 B
。
在第一个代码段中,作为对 printf
的调用的一部分,您调用funtion
三次。 调用函数时,必须在调用函数之前计算其每个参数。 这意味着在调用 function
之前调用 printf
3 次,因此B
仅包含存储在那里的最新值。 这意味着您最终会打印 3 次相同的东西。
此外,函数参数的计算顺序未指定,因此您不知道对function
的哪个调用将是最后一个。 打印三次的值可以是 1、2 或 3。
在第二个代码段中,由于您在每次printf
调用中只调用function
一次,因此对于将要打印的内容没有歧义。
由于只有一个缓冲区B
,每次函数调用都会覆盖它。由于printf
调用 main
调用函数 3 次,因此 sprintf
三次都找到相同的缓冲区。并且无法保证在函数参数的计算中调用函数的顺序。