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

标签 c++ c variables initialization comma-operator

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

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

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

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

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

但我的问题实际上是重新检查变量初始化的情况。我的假设是否不正确 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;

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

关于c++ - 逗号作为变量初始化中的分隔符(不是作为运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54200314/

相关文章:

c++ - 如何检查线程中是否调用了析构函数?

c++ - 如何从 C++14 中的广义 lambda 捕获返回包含 std::unique_ptr 的 std::function ?

c++ - 处理双数组的未对齐部分,将其余部分向量化

c++ - 按位读取文件 C++

c - C中数组的地址等于它的第一个元素吗

C++ 宏 : manipulating a parameter (specific example)

java - 多个字符串中使用一个字符串 "classes"

c++ - 如何检测类中是否确实存在特定的成员变量?

c - 用于演示矩阵的简单 C 图形库

java - 将对象存储到临时对象中并且不更改原始对象值