#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 =三维= 5 任何人都可以解释一下我是如何得到这个输出的?
答案 0 :(得分:6)
您的代码:
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
的评估对计算的状态没有任何作用。同样,对于a
的表达式中的d
进行评估。
d=(a,b)
怎么样?它如何在输出中显示d=5
?
逗号运算符是C中所有运算符的最低优先级。同样重要的是要记住函数的参数列表中的逗号是不是逗号运算符。
逗号运算符的行为,例如:
x, y;
是评估表达式x
并丢弃结果,然后计算表达式y
(整体结果是y
的值)。逗号运算符有一个序列点;这是一个对你来说无关紧要的改进,但将来也可以做到。
在你的表达中:
d = (a, b);
表达式a
被评估(它是3)并被忽略;然后计算表达式b
(它是5),并将其用作逗号运算符表达式的结果,因此用作带括号的表达式的结果,因此将值5分配给d
。< / p>
相比之下,在你的表达中:
c = a, b;
逗号运算符的LHS为c = a
,因此评估a
(它为3)并分配给c
。然后将其丢弃,并评估b
。因此,整个表达式语句只为c分配3。
您可能会问,“为什么逗号运算符有用?”
有些地方很有用,例如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,那就是International Obfuscated C Code Contest。
如果您正在编写宏,有时逗号运算符可以节省生命。
答案 1 :(得分:4)
因为逗号运算符(,
)的优先级低于赋值运算符(=
)。所以你的第一个例子相当于:
(c=a),b;
见这里:http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence。
答案 2 :(得分:2)
问题主要围绕陈述
c=a,b;
d=(a,b);
=
运算符的优先级低于,
运算符,因此第一个语句意味着:
(c=a),b;
,
运算符返回第二个操作数的值,因此第二个语句表示:
a,(d=b);
答案 3 :(得分:0)
好的,我会做的
c=a,b;
意思是:
c=a;
b;
d=(a,b);
意思是: 一个; b; 将最后的“结果”分配给d;
“,”逗号分隔两个陈述。最后一个语句的返回是合并语句的结果
答案 4 :(得分:0)
你的输出会是 c = 3 d = 5; 为了可视化结果你应该知道{=} - 赋值运算符和{,} - 逗号运算符的关联性。 - &gt;因为赋值(=)优先于逗号(,),你的第一个语句c = a,b相当于
(a=3),5;
以逗号分隔的表达式始终从左到右进行计算。所以表达式的值
(expr1,expr2)
始终是最后一个表达式的值。因此,在你的第二个陈述中,d =(a,b)右边的结果是d = 5 ...