C++删除语法

sou*_*rar 40 c++

我偶然发现了这种"删除"的不寻常用法.只是想知道以下行是删除指针还是仅删除第一行?

delete ptr1, ptr2
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 54

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

第二个指针ptr2只是一个无用的表达式.

delete操作者具有比更高的优先级,操作,所以,如同其被写入的表达进行解析:

(delete ptr1) , (ptr2)
Run Code Online (Sandbox Code Playgroud)

而不是像是写的:

delete (ptr1 , ptr2)
Run Code Online (Sandbox Code Playgroud)

如果,优先级高于delete,则只删除第二个指针.


Jer*_*fin 11

James McNellis是正确的,这是逗号运算符,但他的运算符优先级错误.他(显然)认为它可以解决:

delete (ptr1, ptr2);
Run Code Online (Sandbox Code Playgroud)

在这种情况下他是对的 - 它只会删除第二项.然而,实际上,delete也是一个运算符,并且具有比逗号运算符(其具有尽可能低的优先级)更高的优先级,因此它实际上可以用作:

(delete ptr1), ptr2;
Run Code Online (Sandbox Code Playgroud)

所以它删除了第一个指针,表达式的结果是第二个指针的值 - 它还没有被删除,因此它仍然有效(如果它以前是).

我会回应马丁·约克的结论,我认为这支持了它.我怀疑即使只有百分之一的C++程序员知道C++以及James McNellis - 当他对构造的作用的答案是错误的时候,这是一个可靠的迹象,几乎没有人会知道它的真正作用.我认为没有人可以确定它正在做的事情.事实上,我猜它是打算删除它们不应该做的两个对象(即,除非编译器有错误,否则不会).

[编辑:我看到在写这篇文章的时候,詹姆斯纠正了他的回答.我向詹姆斯道歉 - 但我认为基本结论是正确的,所以我不会删除这个,至少现在是这样.


Ian*_*ook 6

我不推荐它,但以下工作 -

delete ( delete p1, p2 );
Run Code Online (Sandbox Code Playgroud)

这可以概括如下 -

delete ( delete ( delete p1, p2 ), p3 );
delete ( delete ( delete ( delete p1, p2 ), p3 ), p4 );
Run Code Online (Sandbox Code Playgroud)

  • 这可能是正确的,但它对极端完全没有帮助. (9认同)
  • "我不会推荐它,但是霰弹枪会通过以下方式从你的脚趾上移除碎片......"只是不要在一开始就给出错误的建议. (6认同)
  • 实际上,知道运算符的工作原理很有用.在这种情况下,它可能不是*建议*,但它仍然是很好的知道. (6认同)

Mar*_*ork 5

只是看着它吓到我了.

即使它是合法的也不要使用它,因为大多数人必须停下来思考(并且仍然会弄错)(前两个答案中的一个必须是错误的,因为它们相互矛盾,我的第一直觉是逗号操作员问题(但我不知道))).

即使是现在我也不会回答这个问题,直到我编写了一个例子并对其进行了测试,即便如此,我也会害怕会出现问题的语言中的极端情况.

  • 每天写Lisp?顺便说一句,你忘了a):P (2认同)

lor*_*ova 5

考虑以下示例代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

~foo() 1
Run Code Online (Sandbox Code Playgroud)

正如詹姆斯已经回答的那样,原因是运营商的优先权.