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

Kun*_*rav 1 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();
 }
Run Code Online (Sandbox Code Playgroud)

我得到输出为c = 3d = 5任何人都可以解释我,我是如何得到这个输出?

Jon*_*ler 6

你的代码:

a=3;
b=5;
c=a,b;
d=(a,b);
Run Code Online (Sandbox Code Playgroud)

被视为写得好:

a=3;
b=5;
(c=a),b;
d=(a,b);
Run Code Online (Sandbox Code Playgroud)

这就是为什么c == 3d == 5.

一个好的编译器可能会警告你包含赋值的行c; 评价对b计算的状态没有任何作用.类似地用于a表达式中的评估d.


怎么样d=(a,b)- 它如何d=5在输出中显示?

逗号运算符是C中所有运算符的最低优先级.记住函数的参数列表中的逗号不是逗号运算符也很重要.

逗号运算符的行为举例说明:

x, y;
Run Code Online (Sandbox Code Playgroud)

是评估表达式x并丢弃结果,然后评估表达式y(并且整体结果是值y).逗号运算符有一个序列点; 这是一个对你来说无关紧要的改进,但未来可能会做.

在你的表达中:

d = (a, b);
Run Code Online (Sandbox Code Playgroud)

表达式a被评估(它是3)并被忽略; 然后计算表达式b(它是5),并将其用作逗号运算符表达式的结果,因此也用作括号表达式的结果,因此将值5赋值给d.

相比之下,在你的表达中:

c = a, b;
Run Code Online (Sandbox Code Playgroud)

逗号运算符的LHS是c = a,所以a被评估(它是3)并分配给c.然后扔掉它,并b进行评估.因此,整体表达式语句只为c分配3.

您可能会问,"为什么逗号运算符有用?"

有些地方很有用,例如for循环的初始化和增量部分:

for (i = 0, s = p; *s != '\0'; i++, s++)
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

那里有两个逗号运算符.第一个包含一对作业; 第二个包含一对带有副作用的表达式.

有时使用它的另一个地方(虽然我认为它很少是好的风格),是:

if (some_variable == A_VALUE)
    p = q++, r = z;
Run Code Online (Sandbox Code Playgroud)

这种"保存"必须在条件体周围添加括号.但是,隐藏这样的作业并不是一种好的风格.代码应该是(给予或采取括号的位置,这是有争议的):

if (some_variable == A_VALUE)
{
    p = q++;
    r = z;
}
Run Code Online (Sandbox Code Playgroud)

如果您喜欢Obfuscated C,那就是国际混淆C代码竞赛.

如果您正在编写宏,有时逗号运算符可以节省生命.