参考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
答案 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)
逗号运算符在您的代码中引入了一个序列点。语句按以下顺序求值:
x = x + 2
,此时x
中的本地fun
为7。
x + 1
,其结果为8,并返回。
为澄清起见,这是显示操作符优先级的带括号的版本:
return (x=x+2),x+1;
计算左侧表达式,并丢弃其值。右侧表达式的值是返回的值。