C/C++中()与{}初始化int变量的运行机制及取值规则疑问
C语言两种初始化语法的底层逻辑说明
小括号()初始化的运行规则
小括号在C中属于优先级调整运算符,没有专属的初始化语义,括号内的内容会被作为普通表达式求值:
- 当括号内仅包含单个值时,比如
(6),整个表达式的求值结果就是值本身,所以int a = (6)完全等价于int a = 6,运行输出6符合预期。 - 当括号内包含多个用逗号分隔的值时,比如
(2, 3, 4, 5),这里的逗号是逗号运算符:逗号运算符的求值逻辑是从左到右依次执行每个子表达式,最终整个表达式的返回值为最后一个子表达式的结果,所以上述括号表达式的求值结果是5,a的初始化值就是5。
后续打印逻辑也符合运算符规则:a--是后置自减,先返回a的当前值5再将a减为4;--a是前置自减,先将a从4减为3再返回3,两个printf的输出拼接后就是你看到的53。
花括号{}初始化的运行规则
花括号是C标准定义的聚合初始化专用语法,原本用于数组、结构体、联合体等聚合类型的批量初始化,C99标准之后允许对标量(int、char等基础类型)使用花括号初始化:
- 当花括号内仅包含单个值时,比如
{6},直接用该值初始化标量变量,效果和普通赋值完全一致,输出6符合预期。 - 当花括号内包含多个值时,聚合初始化的规则是按声明顺序依次给对应成员/元素赋值,超出目标容量的初始化值会被直接忽略。标量类型可以理解为只有1个“存储位”的聚合,所以只会取花括号内第一个值2完成初始化,后面的3、4、5都会被丢弃,多数编译器开启警告选项后会提示
excess elements in scalar initializer来提醒你存在无效的初始化值。
内容的提问来源于stack exchange,提问作者Abhishek Sinha
相关产品推荐
相关产品推荐

