【问题标题】:What's the relation between comma and parentheses and curly braces in C?C中的逗号和括号以及花括号之间的关系是什么?
【发布时间】:2019-11-19 09:46:27
【问题描述】:

我有以下两行,找不到很好的解释

我确实读到了逗号作为运算符和分隔符的双重性质,括号的优先级,以及逗号作为序列点。

int a =(3,4) // here a is 4 because comma here is an operator first a=3 , then a = 4 
int a={3,4} // here is the problem , should not a=3 and then a =4 too because comma is a sequence point or it's undefined behavior or what ?

我期待

a=4
a=4 , 
but the actual output is 
a=4 , a=3

【问题讨论】:

标签: c comma parentheses curly-braces


【解决方案1】:

第一种情况:

int a =(3,4);

该变量使用由逗号运算符和括号组成的表达式进行初始化。正如您正确推测的那样,此表达式的计算结果为 4,这就是分配给 a 的值。

第二种情况:

int a={3,4};

变量使用初始化器列表进行初始化,这是花括号表示的,逗号分隔初始化器。如果所讨论的变量是结构或数组,则初始化列表中的值将分配给每个成员。如果初始值设定项多于成员,则多余的值将被丢弃。

所以a被赋值为初始化列表中的第一个值,即3,而值4被丢弃。

你这样做了吗:

int a[2] = {3, 4};

那么a[0] 将是 3,a[1] 将是 4。

【讨论】:

  • Nitpick:标准规定“标量的初始值设定项应该是单个表达式,可选地括在大括号中”,其中“表达式”必须根据形式进行解释语法为assignment-expression,在最外层不能包含逗号运算符。因此,OP 的大括号括起来的初始化程序的行为是undefined。假设大括号内的额外初始化程序将被简单地丢弃是不安全的。事实上,某些实现可能会使用它而不是第一个,当然也可能会观察到任何更狂野的行为。
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
相关资源
最近更新 更多