我刚碰到这段代码:
delete a, a = 0;
它编译并运行得很好。但这不应该是:
delete a;
a = 0;
为什么分隔语句使用,在这种情况下允许?
谢谢:)
答案 0 :(得分:7)
在C和C ++中,大多数“语句”实际上是表达式。添加到表达式中的分号使其成为一个语句。或者,允许(但几乎总是坏的样式)将副作用表达式与逗号运算符分开:左侧表达式的副作用被评估(并且其值被丢弃),右侧表达式被评估。评估-side表达式的值。
答案 1 :(得分:6)
这是逗号运算符。它评估它的两个参数并返回第二个参数。
答案 2 :(得分:5)
这是逗号运算符。它可用于分隔表达式,但不能用于声明。
答案 3 :(得分:5)
那是comma operator。 MSDN文章是here。并查看this问题,了解其工作原理。
答案 4 :(得分:1)
虽然可以编写这样的代码,但可能有些奇怪。如果您有一个结构T
,则稍微更实际的用例如下:
struct T {
bool check() const;
void fix();
};
现在你要遍历struct中的所有内容并运行检查,然后在check返回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);
我不会在没有特别好的理由的情况下使用它,但它确实允许你从条件中调用任何函数,这很方便。