【问题标题】:C/C++ Syntax - Separating statements with , instead of ; legal?C/C++ 语法 - 用 , 而不是 ; 分隔语句合法的?
【发布时间】:2011-11-16 09:46:52
【问题描述】:
我刚刚遇到了执行此操作的这段代码:
delete a, a = 0;
它编译并运行得很好。但这不应该是:
delete a;
a = 0;
为什么在这种情况下允许使用 , 分隔语句?
谢谢:)
【问题讨论】:
标签:
c++
c
syntax
separator
【解决方案1】:
在 C 和 C++ 中,大多数“语句”实际上是表达式。添加到表达式的分号使其成为语句。或者,允许(但几乎总是不好的风格)用逗号运算符分隔有副作用的表达式:左边的表达式被评估它的副作用(并且它的值被丢弃),右边的表达式-side 表达式对其值进行评估。
【解决方案3】:
这是逗号运算符。它可以用来分隔表达式,但不能用来分隔声明。
【解决方案5】:
虽然可以编写这样的代码,但可能有点奇怪。如果您有一个结构 T 如下所示,则更实际的用例是:
struct T {
bool check() const;
void fix();
};
现在您要遍历结构中的所有内容并对其运行检查,如果检查返回 false,则调用 fix。这样做的简单方法是
for (list<T>::iterator it = mylist.begin(); it < mylist.end(); ++it)
if (!it->check())
it->fix();
让我们假设你想用尽可能短的方式来写它。 fix() 返回 void 意味着您不能只将其置于条件中。但是,使用逗号运算符可以解决这个问题:
for (auto it = mylist.begin(); it != mylist.end() && (it->check() || (it->fix(), true)); ++it);
如果没有特别好的理由,我不会使用它,但它确实允许您从条件调用任何函数,这很方便。