【问题标题】:Can anyone please explain the output of the program?谁能解释一下程序的输出?
【发布时间】:2012-03-24 20:45:59
【问题描述】:
#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 谁能解释一下我是如何得到这个输出的?

【问题讨论】:

    标签: c


    【解决方案1】:

    您的代码:

    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 中所有运算符中优先级最低的。同样重要的是要记住,函数参数列表中的逗号是 not 逗号运算符。

    逗号操作符的行为举例:

    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;
    }
    

    如果你喜欢 Obfuscated C,那就是International Obfuscated C Code Contest

    如果您正在编写宏,有时逗号运算符可以成为救命稻草。

    【讨论】:

    • 那么 d=(a,b) 怎么在输出中显示 d=5 呢?
    【解决方案2】:

    因为逗号运算符 (,) 的优先级低于赋值运算符 (=)。所以你的第一个例子相当于:

    (c=a),b;
    

    请看这里:http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

    【讨论】:

      【解决方案3】:

      问题主要围绕语句展开

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

      = 运算符的优先级低于, 运算符,所以第一条语句的意思是:

      (c=a),b;
      

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

      a,(d=b);
      

      【讨论】:

        【解决方案4】:

        好的,我会的

        c=a,b;
        

        意思是:

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

        意思是: 一种; 乙; 将最后一个“结果”分配给 d;

        "," 逗号分隔两个语句。最后一条语句的返回是合并语句的结果

        【讨论】:

          【解决方案5】:

          你的输出将是 c=3 d=5; 要可视化结果,您应该知道 {=}-赋值运算符和 {,}-逗号运算符的关联性。 ->因为赋值 (=) 优先于逗号 (,) 您的第一条语句 c=a,b 等价于

          (a=3),5;
          

          用逗号分隔的表达式总是从左到右计算。所以表达式的值

          (expr1, expr2)

          始终是最后一个表达式的值。因此,在您的第二个语句中 d=(a,b) 右侧的结果是 d=5...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-03
            • 2017-09-12
            • 2015-09-18
            • 1970-01-01
            • 2021-02-27
            相关资源
            最近更新 更多