最初の 2 つは同等です。関数として何かを呼び出しているのではなく、式の一部の周りに冗長な括弧のセットを配置しているだけです.vs.または(あまりにも一般的な)1+2*3
vs .とほぼ同等です.1+(2*3)
return(23);
return 23;
2 番目では、[]
いつ括弧を追加したかを省略したため、未定義の動作が発生しました。
後者の典型的な (ただし確実に保証されているわけではありません) 結果は、メモリのブロック自体を解放しますが、配列内のアイテムのデストラクタの呼び出しに失敗します。あなたの場合(その配列にchar
はデストラクタがありません)、それは検出できません。ただし、OS がプログラムの実行を停止するなど、他の副作用が発生する場合もあります。
例:
#include <iostream>
struct item {
item() { std::cout << "create\n"; }
~item() { std::cout << "destroy\n"; }
};
int main() {
std::cout << "test 1\n";
item *items = new item[5];
delete [] items;
std::cout << "test 2\n";
item *items2 = new item[5];
delete items2;
}
結果:
test 1
create
create
create
create
create
destroy
destroy
destroy
destroy
destroy
test 2
create
create
create
create
create
destroy
...その後、OS によって実行が停止されます。