C++ C++;删除语法

C++ C++;删除语法,c++,C++,我遇到了“delete”这个相当不寻常的用法。只是想知道下一行是删除两个指针还是只删除第一个指针 delete ptr1, ptr2 这无疑是一个错误。这里的逗号是逗号运算符,不是分隔符。仅删除第一个指针ptr1 第二个指针,ptr2,只是一个什么也不做的表达式 delete运算符比,运算符具有更高的优先级,因此表达式的解析方式与编写表达式的方式相同: (delete ptr1) , (ptr2) delete (ptr1 , ptr2) 而不是像写的那样: (delete ptr1) ,

我遇到了“delete”这个相当不寻常的用法。只是想知道下一行是删除两个指针还是只删除第一个指针

delete ptr1, ptr2

这无疑是一个错误。这里的逗号是逗号运算符,不是分隔符。仅删除第一个指针
ptr1

第二个指针,
ptr2
,只是一个什么也不做的表达式

delete
运算符比
运算符具有更高的优先级,因此表达式的解析方式与编写表达式的方式相同:

(delete ptr1) , (ptr2)
delete (ptr1 , ptr2)
而不是像写的那样:

(delete ptr1) , (ptr2)
delete (ptr1 , ptr2)

如果
的优先级高于
delete
,那么只有第二个指针会被删除。

看着它我就害怕

即使这是合法的,也不要使用它,因为大多数人不得不停下来思考(并且仍然会出错(前两个答案中的一个肯定是错误的,因为它们相互矛盾,我的第一直觉是逗号运算符问题(但我不知道)))


即使是现在,我也不会回答这个问题,直到我编写了一个示例并对其进行了测试,即使这样,我也会害怕语言中会导致问题的极端情况。

考虑以下示例代码:

class foo
{
    int _a;
public:
    foo(int a) : _a(a) { }
    ~foo() { printf("~foo() %d\n", _a); }
};


int main(int argc, char** argv)
{
    foo *p1 = new foo(1), *p2 = new foo(2);
    delete p1, p2;
    return 0;
}
输出为:

~foo() 1

正如James已经回答的那样,原因是运算符优先级。

James McNellis认为这是逗号运算符是正确的,但他认为运算符优先级是错误的。他(显然)认为结果是:

delete (ptr1, ptr2);
(delete ptr1), ptr2;
在这种情况下,他是对的——它只会删除第二项。然而,实际上,delete也是一个运算符,它的优先级远远高于逗号运算符(逗号运算符的优先级尽可能低),因此它实际上是:

delete (ptr1, ptr2);
(delete ptr1), ptr2;
所以它删除第一个指针,表达式的结果是第二个指针的值——它还没有被删除,所以它仍然有效(如果以前是)

我赞同马丁·约克的结论,我认为这也支持了它。我怀疑即使是一个C++程序员都知道C++和James McNellis——当他对构造的回答是错误的时,它就表明几乎没有人知道它真正的作用。我认为根本没有人能确定它是在做预期的事情。事实上,我猜这是为了删除这两个对象,它不应该这样做(也就是说,除非编译器有bug,否则不会这样做)


[编辑:我看到在我写这篇文章的时候,詹姆斯已经更正了他的答案。我向詹姆斯道歉——但我认为基本结论是正确的,所以我不会删除这篇文章,至少现在是这样。]

我不建议这样做,但下面的内容会起作用-

delete ( delete p1, p2 );
这可以概括如下-

delete ( delete ( delete p1, p2 ), p3 );
delete ( delete ( delete ( delete p1, p2 ), p3 ), p4 );

顺便说一下,删除关键字只与C++相关,与C.编写Lisp日报无关吗?顺便说一句,你忘了a):PFixed(现在超过15个字符):-)我认为逗号运算符的结果是逗号分隔列表中的最后一个表达式(因此,如果不是删除了ptr2,则与原始答案类似),或者这里有什么更棘手的事情吗?@Martin:+1回答你的答案,因为它非常复杂(前两个答案最初都是错误的;直到我写了一个例子并进行了测试,我才意识到优先级问题)。我更新了一个解释,解释了为什么删除第一个指针。发布后,我看到了,很好的捕获。如果没有编译器和测试用例,我将永远不会看到这种美妙的扭曲。结论是不可能删除一行中的多个指针吗?按括号分组指针会改变优先级,但不会调用delete多次。无需道歉;我最初的回答完全错误,事后看来,我应该在编辑时使用删除线,因此很明显它是在五分钟的窗口中编辑的。这可能是正确的,但完全没有帮助。“我不建议这样做,但猎枪可以通过以下方式去除脚趾上的碎片……”首先不要给出不好的建议。事实上,了解操作员的工作方式是很有用的。在这种情况下,这可能不可取,但知道仍然很好。