为什么fun函数的返回值是8而不是7?

时间:2019-09-14 20:32:32

标签: c return-value comma

参考Comma-Separated return arguments in C function [duplicate]

x=x+2,x+1;

将被评估为

x=x+2; 

但是,在以下代码的情况下

#include<stdlib.h>
#include<stdio.h>

int fun(int x)
{
    return (x=x+2,x+1); //[A]
}

int main()
{
   int x=5;
   x=fun(x);
   printf("%d",x); // Output is 8
}

不应该在行[A]中被评估为

x=x+2;

给予x = 7

7 个答案:

答案 0 :(得分:56)

语句applicant = 1 while open_jobs: #traversing through the applicants from applicant 1 to n if(applicant <= n): newJob = open_jobs.pop() # if an applicant does not have a job, they accept. if(current_job[applicant] == -1): current_job[applicant] = newJob else: # if this applicant prefers the offer to their current job : # they quit their current job and accept the offer if(rankings[str(applicant) + "," + str(newJob)] > rankings[str(applicant) + "," + str(current_job[applicant])]): open_jobs.append(current_job[applicant]) current_job[applicant] = newJob else: open_jobs.append(newJob) applicant += 1 print(current_job) 等效于:

return (x = x + 2, x + 1);

答案 1 :(得分:15)

在编写return (x=x+2,x+1)时,首先对第一个表达式求值,因此对x=x+2求值,导致x等于7的副作用。然后对第二个表达式求值并返回,因此该函数返回x + 1并因此返回8。

如果您写过return (x+2,x+1);,结果将是6,因为第一个表达式x+2没有任何副作用。

答案 2 :(得分:12)

分别评估return中的两个部分,并返回最后一条指令的结果:

起初我们有:

x = x + 2 // 7

现在x在第二次评估之前更新为7,得出:

x + 1 // 7 + 1 = 8

最后返回8

为了更好地理解,请考虑以下中间变量的情况:

return (y = x + 2, y + 1);

答案 3 :(得分:6)

您方便地链接到的质量检查状态

  

逗号运算符计算一系列表达式。的价值   逗号组是列表中最后一个元素的值。

所以

的值
x+2,x+1;

x+1,没有副作用。


示例代码:

#include<stdio.h>
int main(int argc, char * argv){
    int x;
    x = 0;
    x = (x+2, x+1);
    printf("%d\n", x);
    return 0;
}

运行时产生1


但是,当您这样做

return (x=x+2, x+1)

确实有副作用x首先增加2,然后x再增加1并返回结果。

答案 4 :(得分:3)

如其他用户所述,命令流从左到右,并且在return的情况下,它将在最右边的运算符中返回该值。在此运算符之前写的并用逗号分隔的内容与行写表达式没有区别。示例:

return (x = x + 2, x = x - 5, x + 1);

下面的代码产生相同的结果:

x = x + 2;  
x = x - 5;
return x + 1;

对于x = 0,这将返回-2。请注意,对于这两个代码,如果我们将x = x - 5更改为x - 5,即我们从5中减去x,但没有将其结果保存到任何地方,则返回值{ {1}}将更改为x,并因此确认等效性。

答案 5 :(得分:3)

这是运算符优先级的问题。

x=x+2,x+1被评估为(x=x+2), (x+1),而不是x=(x+2,x+1)

答案 6 :(得分:0)

逗号运算符在您的代码中引入了一个序列点。语句按以下顺序求值:

  1. x = x + 2,此时x中的本地fun为7。

  2. x + 1,其结果为8,并返回。

为澄清起见,这是显示操作符优先级的带括号的版本:

return (x=x+2),x+1;

计算左侧表达式,并丢弃其值。右侧表达式的值是返回的值。