【问题标题】:Comma as separator in variable initialization (not as operator)逗号作为变量初始化中的分隔符(不作为运算符)
【发布时间】:2019-06-09 13:13:29
【问题描述】:

这似乎是一个如此简单的问题,但我已经很久没有以自己的风格研究过......当初始化用逗号分隔的变量时,我认为以下做法是不安全的做法:

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

因为我从来没有真正使用逗号运算符作为语法糖等;而是表明两个表达式是独立的——作为对“细粒度并行性”(或表达式独立性)的一种隐含评论,这通常会使代码更简洁,例如,

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

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

但我的问题实际上是重新检查变量初始化案例。我是否不正确地假设 nxn 不能按预期进行初始化?还是我一直在被误解下苦苦挣扎?

【问题讨论】:

  • 如有疑问,请始终使用更安全的方法 :)
  • 根据this declarator reference,声明列表是完全从左到右的,包括初始化。简而言之,unsigned int n = foo.size, nxn = n * n; 等价于unsigned int n = foo.siz; unsigned int nxn = n * n;
  • 使用逗号的一个可能缺点是您可能会与int* a, b 之类的语句混淆。这看起来像两个变量都是int* 类型,但实际上我们得到int* a; int b;
  • @grapes - 是的。我还担心可读性(我不会走这样的捷径,因为它往往会减慢读者的速度)。

标签: c++ c variables initialization comma


【解决方案1】:

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

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

【讨论】:

  • +1。谢谢。对于简单案例,我不确定我是否同意第二行 - 但风格可能是非常个人的事情!
  • @BrettHale:我同意你的看法。我有幸雇佣最聪明的人。我的编码标准背后的理念是适当地利用语言的每一个特性。如果unsigned int n = foo.size, nxn = n * n; 的行为对我店里的某个人来说并不明显,那么他们需要留出一些时间来学习该语言。如果有人将其中一种类型重构为 int 并为另一种类型保留 unsigned,在这种情况下使用单独的行可能会很危险。
【解决方案2】:

[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 是一个指针,bar 是一个 int。你需要

int * foo, * bar;

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

int * foo;
int * bar;

并为安全起见支付额外的密钥费用。

【讨论】:

  • 我想如果这是规则,我看不出有任何歧义。事实上,如果正确的话,我会更喜欢 使用我在示例中给出的语法。 others 会难以区分逗号作为分隔符,逗号作为运算符吗?对风格有什么想法吗?
  • @BrettHale 我不能代表其他人,但我喜欢每行声明一个变量。处理指针时是双重的。例如int * foo, bar; 没有声明两个int*。相反,foo 是一个指针,bar 只是一个int。你需要int * foo, * bar 来获得两个指针。正是出于这样的原因,我将它们分开。如果您以后需要,它还可以更轻松地删除变量。我已将此添加到答案中。
  • 我当然同意这一点。这只是在我提供的当前项目中,我想在其中制作相同类型的nn * n 等。我觉得这种风格更简洁。与指针混合 - 难以阅读,风格不佳。
  • @BrettHale 您可以随时使用autosome_type var1 = some value; auto var2 = var1 * var1; auto var3 = var2 * var1; ...
猜你喜欢
  • 1970-01-01
  • 2018-06-17
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2017-02-02
  • 2020-12-29
相关资源
最近更新 更多