【问题标题】:Precedence of comma operator [closed]逗号运算符的优先级[关闭]
【发布时间】:2016-05-06 03:12:23
【问题描述】:
#include<stdio.h>
void main(){
  int a,b;
  a=3,1;
  b=(5,4);
  printf("%d",a+b);
} 

我是 C 新手,无法理解上述程序。谁能解释一下程序输出?

【问题讨论】:

  • 什么输出?你忘记展示了。
  • 一个问题是,如果您要求对输出进行解释,但实际上没有显示任何输出,有些人可能会认为您根本没有编译/构建/运行您的代码,并且您的帖子是一个不费吹灰之力的作业转储。为避免这种情况,请在问题中包含尽可能多的信息。

标签: c


【解决方案1】:

comma operator 按顺序计算其每个子表达式,丢弃除最右边的子表达式以外的所有子表达式的值,并计算最右边的子表达式。

此运算符的优先级最低,实际上低于赋值运算符。所以这个:

a=3,1;

相当于:

(a=3),1;

所以a 被分配了3 的值,然后评估了1 的值。完整的表达式具有值 1,但该值被丢弃,因为它没有分配给任何东西。

相比之下:

b=(5,4);

括号导致逗号运算符首先计算。所以5被评估并丢弃,然后4被评估并分配给b

所以a 的值为 3,b 的值为 4。所以程序会打印出a+b,即7

【讨论】:

    【解决方案2】:

    这个表达式语句

      a=3,1;
    

    包含两个运算符。第一个是赋值运算符a = 3,它将3 分配给a,第二个运算符是逗号运算符。你可以想象它像 ( a = 3 ), 1。也就是说,它有两个操作数,即表达式( a = 3 )1。第二个表达式是整数字面量1 的值,没有任何作用。

    考虑到赋值运算符的优先级高于逗号运算符。

    在这个表达式语句中

      b=(5,4);
    

    还有两个相同的运算符:赋值运算符和逗号运算符。但是现在逗号运算符括在括号中。逗号运算符的值是其第二个操作数的值。所以带有逗号运算符( 5, 4 ) 的表达式产生4。此值分配给b

    你终于有了

    printf("%d",a+b);
    

    输出ab 之和等于 3 + 4 = 7。

    【讨论】:

      【解决方案3】:

      如果你用 -Wall 选项编译它,编译器会警告你:

      test.c: In function ‘main’:
      test.c:159:6: warning: right-hand operand of comma expression has no effect [-Wunused-value]
         a=3,1;
            ^
      test.c:160:7: warning: left-hand operand of comma expression has no effect [-Wunused-value]
         b=(5,4);
             ^
      

      这将向您解释将哪个值作为ab 变量的初始值。

      在这种情况下a=3 b=4

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 2013-05-27
        • 1970-01-01
        • 2021-03-05
        • 1970-01-01
        • 2021-05-05
        • 2011-07-07
        相关资源
        最近更新 更多