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

Comma as separator in variable initialization (not as operator)

这似乎是一个简单的问题,但我已经很久没有以自己的方式检查过...在初始化用逗号分隔的变量时,我假设以下是不安全的做法:

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

因为我从来没有真正使用逗号 operator 作为句法糖等;而是表明两个表达式是独立的——作为对 'fine-grained parallelism'(或表达式独立性)的一种隐式注释,这通常会使代码更简洁一些,例如,

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

而不是要求 {} 分号分隔表达式的范围。

但我的问题实际上是重新检查变量初始化的情况。我的假设是否正确 nxn 不能依赖于按预期进行初始化?还是我一直在误解中苦苦挣扎?

nxn 将正确初始化,因为 n 已在定义 nxn 的位置进行定义和初始化。

然而,为了清楚起见,最好将变量放在不同的行中。这样做可以避免歧义,让阅读您代码的任何人都更加清楚您的意图。

[dcl.decl]/3

Each init-declarator in a declaration is analyzed separately as if it was in a declaration by itself. [...]

我们明白了

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

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

有一个注释,其中包含其他规则的例外情况,例如 auto 或者如果名称遮盖了类型但这些规则不适用于这种情况。


如果将多个变量放在一行中,请谨慎使用指针

int * foo, bar;

不给你二指点。相反,foo 是一个指针,bar 是一个 int。你需要

int * foo, * bar;

得到两个指针。出于这个原因,我更愿意使用

int * foo;
int * bar;

并为安全起见支付额外的击键费用。