为什么这样输出C程序

时间:2013-10-01 01:29:58

标签: c initialization comma-operator

我试图运行以下代码并遇到了一些结果。有人可以解释一下:

int number = {12,13,14};
printf("%d",number);

以上代码将输出打印为12。如果我尝试运行以下代码:

int number = (12,13,14);
printf("%d",number);

这会将输出打印为14,但使用以下代码将输出打印为12

int number;
number = 12,13;
printf("%d",number);

3 个答案:

答案 0 :(得分:4)

number = {12,13,14}是标量初始化,但是你提供的元素多于你应该提供的元素,编译器会抛出一个警告,我假设你已经忽略了,第一个元素12被分配给变量number

使用number = (12,13,14)时,

逗号(,)运算符计算第一个操作数并丢弃结果,然后计算第二个操作数并返回结果。

所以这里丢弃12,将13评估为13并返回。现在返回的13值是下一个逗号运算符的第一个操作数。 现在,它将评估13到13并将丢弃此结果13并将评估第二个操作数,即14,并将结果返回为14,分配给变量number

执行以下操作时

  number = 12,13;
  printf("%d",number);

这将打印12,因为=的优先级大于,,因此将评估第一个number = 12并且=返回指定的值,即12。 现在,逗号运算符得到两个操作数,即=运算的值,即12和13。 使用逗号运算符12将被评估为12并被丢弃。评估并返回13。 回到?没有人。未分配给number,因为已执行分配。 因此number = 12,13;看起来像(number=12),13;

试试这个。

   int num1,num2;
   num2 = (num1 = 13,14);
   printf("%d %d",num1,num2);

这将根据早期代码输出的参数打印13 14

答案 1 :(得分:1)

int number = {12,13,14};

number是一个int,它不会指望像这样的initalizer,所以非法的C语法。

int number = (12,13,14);

逗号运算符返回右操作数作为结果,它等同于int number = ((12,13),14),因此number的值为14

int number = 12,13;

这是初始化,而不是分配。所以不应该在这里使用逗号运算符,非法的C语法。

编辑后,此代码

int number;
number = 12,13;

是一个表达式语句,它是一个逗号运算符,第一个操作数是一个赋值number = 12,它将number赋予12作为副作用,第二个操作数13是一个表达式声明,它没有任何作用,因为它没有副作用。

答案 2 :(得分:0)

第一个表达:

int number = {12,13,14};
如果我们查看undefined behavior部分6.7.8 初始化 2 ,则

draft C99 standard

  

初始化程序不应尝试为未包含在实体中的对象提供值   被初始化。

在这种情况下,intitializer是两个元素。第二种情况依赖于逗号运算符哪个部分6.5.17 2 表示(强调我的):

  

逗号运算符的左操作数被计算为void表达式;有一个   评估后的序列点。然后评估右操作数;结果有类型和值 .97

第二种情况:

int number = (12,13,14);

相当于:

int number = ((12,13),14);

遵循6.5.17中规定的规则(12,13)的结果为1313,14的结果为14。在最后的案例中:

number = 12,13;

由于=,更紧密地绑定(具有更高的优先级),因此值12将被分配给number,然后{{1将被评估,没有副作用。