繁体   English   中英

谁能解释一下程序的输出?

[英]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 == 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求值。 因此,整个表达式语句仅将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM