任何人都可以解释一下程序的输出吗?

时间:2012-03-24 20:45:59

标签: c

#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 任何人都可以解释一下我是如何得到这个输出的?

5 个答案:

答案 0 :(得分:6)

您的代码:

a=3;
b=5;
c=a,b;
d=(a,b);

被视为写得好:

a=3;
b=5;
(c=a),b;
d=(a,b);

这就是c == 3d == 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 ...