2012-03-24 85 views
1
#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 任何人都可以请解释我如何得到这个输出?任何人都可以请解释程序的输出?

回答

2

的结果,问题主要围绕着=操作符比,操作下precendence陈述

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

,所以第一条语句的意思是:

(c=a),b; 

,运算符返回第二操作数的值,所以第二个语句意味着:

a,(d=b); 
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的评估对计算的状态没有影响。类似地,在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被评估。因此,整体表达式语句仅将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

如果您正在编写宏,有时候逗号运算符可能会成为生命保护程序。

+0

d =(a,b) 它如何在输出中显示d = 5? – 2012-03-24 20:54:11

0

OK,我会DOIT

c=a,b; 

方式做:

c=a; 
b; 

d=(a,b); 

的意思是: 一个; b; 将最后的“结果”赋值给d;

“,”逗号分隔两个语句。最后声明的回报是合并报表

0

你的输出将是 c = 3 d = 5; 以显示结果,您应该知道{=} - 赋值运算符和{,} - 逗号运算符的关联性。 - >因为赋值(=)接管优先逗号(,)你的第一条语句C = A,B相当于用逗号分隔

(a=3),5; 

表达式总是从左向右计算。因此,一个表达

(表达式1,表达式2)

的值总是最后一个表达式的值。因此,在你的第二条语句d =(a,b)中,右边的结果是d = 5 ......

相关问题