新的运营商和阵列C++

问题描述:

这是什么线的含义:新的运营商和阵列C++

int* p = new int[2,2]; 
在以下C++代码

#include <iostream> 
using namespace std; 

int main() 
{ 
    int* p = new int[2,2]; 
} 
+2

无法编译,所以它并没有太大的意义。 – chris

+3

@克里斯,[它编译](http://ideone.com/XgS5l)。 – iammilind

+0

@iammilind,哎呀,我离开了'new',它得到过去编译时确定数组大小的误差。难怪我惊讶地发现它没有编译;我做了int int [2,2];'。 – chris

int* p = new int[2,2]; 

实际上意味着

int* p = new int[2]; 

当使用逗号操作,最右边的值被认为是最终的结果。

它创建的整数指针并将其设置为一个新的数组。

+1

建议您撤回此,因为它不是一个非常完整的答案。示例中逗号的含义太重要,不能省略。 – Bryan

这两个2之间的逗号是一个“逗号操作符”。它在C++中很少使用,其语义是评估左侧部分,忽略结果,然后评估右侧部分。它是保证操作数评估顺序的少数几个操作符之一(如果不超载)。

一个好的编译器应该发出警告,因为在你的例子中第一个表达式没有副作用,而new int[2,2]new int[2]完全一样。

注意,在C++其他逗号并不是逗号运算...例如在函数调用的参数之间的逗号并不是逗号运营商和表达不保证的参数评价的顺序。在该函数可以被称为例如可为gh序列上方的线

foo(f(g()), h()); 

f所以你不能:更糟的是可能是一个“评价规程”不存在于所有既不说第一个参数在第二个之前被评估过,也没有说第二个参数在第一个之前被评估过。