无括号循环内用逗号分隔的代码行

jar*_*2gw 5 c++ syntax loops

在上课时,我碰到了这段代码。这是在我的教授的演讲中,我认为这是一个错误,因此出于纯粹的好奇心,我尝试对其进行编译。令我惊讶的是,它实际上是一个有效的代码。我尝试在网上查找它,但是找不到确切的答案。

int n, num;
scanf("%d", &n);
vector<int> arr;
arr.reserve(n);

while (n--)
        scanf("%d", &num),
        arr.push_back(num);

for (int i : arr) printf("%d ", i);
printf("\n");
Run Code Online (Sandbox Code Playgroud)

我希望while循环会导致编译错误,但运行平稳。是标准的还是最近引入的?

lub*_*bgr 3

这就是逗号运算符的作用。它计算运算符 ( ) 的左侧scanf("%d", &num),然后计算右侧 ( arr.push_back(num)) 并返回该表达式的结果。

我认为代码片段对于逗号运算符来说不是一个很好的使用场景。它似乎用于不键入内容{}来创建循环体while,这是懒惰且不必要的“智能”。但它有效。

如果您对逗号运算符的合法用例感兴趣,请查看这篇文章