逗号作为变量初始化中的分隔符(不作为运算符)

时间:2019-01-15 13:55:54

标签: c++ c variables initialization comma

这似乎是一个简单的问题,但是我没有按照自己的风格检查年龄……初始化由逗号分隔的变量时,我认为以下是不安全的做法:

unsigned int n = foo.size, nxn = n * n;

因为我从未真正使用逗号 operator 来表示语法糖等;而是表示两个表达式是独立的-作为对“细粒度并行性”(或表达式独立性)的一种隐式注释,这通常会使代码更加简洁,例如

if (<some condition>)
    a = true, b = value;

而不是使用{}范围来使用分号分隔的表达式。

但是我的问题确实是在重新检查变量初始化情况。我不能正确地假设nxn不能被初始化吗?还是我一直在误解中工作?

2 个答案:

答案 0 :(得分:8)

[dcl.decl]/3

  声明中的每个 init-declarator 都被单独分析,就好像它本身在声明中一样。 [...]

我们明白了

unsigned int n = foo.size, nxn = n * n;

相同
unsigned int n = foo.size;
unsigned int nxn = n * n;

有一条注释,其中包含auto等其他规则的例外,或者名称遮盖了类型,但在这种情况下不适用。


如果将多个变量放在一行上,请对指针非常警惕

int * foo, bar;

不给您两个指针。相反,foo是指针,barint。您将需要

int * foo, * bar;

获得两个指针。因此,我宁愿使用

int * foo;
int * bar;

并为安全起见支付额外的按键。

答案 1 :(得分:3)

nxn将正确初始化,因为已经定义n并在定义nxn的位置对其进行了初始化。

但是,为清楚起见,最好将变量放在单独的行上。这样做避免了模棱两可,使您的意图对于任何阅读您的代码的人来说都更加清楚。