[英]Can anyone please explain the output of the program?
#include<stdio.h>
#include<conio.h>
int main (void)
{
int a,b,c,d;
clrscr();
a=3;
b=5;
c=a,b;
d=(a,b);
printf("c=%d",c);
printf("d=%d",d);
getch();
}
我得到的输出为c = 3d = 5谁能解释一下我如何获得此输出?
您的代码:
a=3;
b=5;
c=a,b;
d=(a,b);
就像被写为:
a=3;
b=5;
(c=a),b;
d=(a,b);
这就是为什么c == 3
和d == 5
。
一个好的编译器可能会警告您有关c
赋值的代码行; b
的求值对计算状态没有任何作用。 类似地,对于d
表达式中的a
的求值。
d=(a,b)
怎么样—它如何在输出中显示d=5
?
逗号运算符是C中所有运算符的最低优先级。同样重要的是要记住,函数的参数列表中的逗号不是逗号运算符。
逗号运算符的行为示例如下:
x, y;
是评估表达式x
并丢弃结果,然后评估表达式y
(总结果为y
的值)。 在逗号运算符处有一个序列点; 这种改进现在对您来说并不重要,但将来可能会适用。
在您的表情中:
d = (a, b);
表达式a
被求值(为3)并被忽略; 然后对表达式b
求值(值为5),并将其用作逗号运算符表达式的结果,并因此用作括号表达式的结果,因此将值5分配给d
。
相反,在您的表情中:
c = a, b;
逗号运算符的LHS为c = a
,因此计算a
(为3)并将其分配给c
。 然后将其丢弃,并对b
求值。 因此,整个表达式语句仅将3分配给c。
您可能会问:“为什么逗号运算符有用?”
在某些地方有用,例如for
循环的初始化和增量部分:
for (i = 0, s = p; *s != '\0'; i++, s++)
{
...
}
那里有两个逗号运算符。 第一个包含一对作业;第二个包含两个作业。 第二个包含一对带有副作用的表达式。
有时使用它的另一个地方(尽管我认为它很少是好的样式)是:
if (some_variable == A_VALUE)
p = q++, r = z;
“节省”必须在条件主体周围添加括号。 但是,隐藏这样的作业并不是一种好的样式。 代码应该是(给出或使用大括号的位置,这是有争议的):
if (some_variable == A_VALUE)
{
p = q++;
r = z;
}
如果您喜欢混淆C,那么可以参加国际混淆C代码竞赛 。
如果您正在编写宏,则有时逗号运算符可以起到救生作用。
因为逗号( ,
)具有比赋值运算符(优先级低=
)。 因此,您的第一个示例等效于:
(c=a),b;
参见此处: http : //en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence 。
问题主要围绕陈述
c=a,b;
d=(a,b);
=
运算符的优先级低于,
运算符,因此第一条语句的意思是:
(c=a),b;
的,
操作者返回第二个操作数的值,那么第二条语句的意思是:
a,(d=b);
好的,我会做
c=a,b;
手段是:
c=a;
b;
d=(a,b);
意思是: b; 将最后的“结果”分配给d;
“,”逗号分隔两个语句。 最后一条语句的返回是合并语句的结果
您的输出将是c = 3 d = 5; 为了使结果可视化,您应该知道{=}-赋值运算符和{,}-逗号运算符的关联性。 ->因为赋值(=)优先于逗号(,),因此第一个语句c = a,b等于
(a=3),5;
用逗号分隔的表达式始终按从左到右的顺序求值。 所以表达的价值
(expr1,expr2)
始终是最后一个表达式的值。 因此,在您的第二条语句d =(a,b)中,右侧的结果为d = 5 ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.