在C ++中在数组之前添加'++'会发生什么?

时间:2013-12-27 21:28:05

标签: c++

我有这段代码:

for(i=0;i<10000;i++){
   double number=distribution(generator);
    ++p[int(nintervals*number)];
}

但我不知道++如何影响数组。任何人都可以解释这个吗?

4 个答案:

答案 0 :(得分:3)

它会增加内存中用int(nintervals*number)索引的数组元素的值。这相当于

++( p[int(nintervals*number)] );  
 |  \_______________________/
 |             |
 |             V 
 |             Array element is evaluated first
 |
 V 
 then ++ operator increment that array element 

答案 1 :(得分:1)

运算符的优先级使代码等效于:

++(p[int(nintervals*number)]);

也就是说,preincrement适用于数组中该位置的元素,而不是数组本身。

答案 2 :(得分:1)

++只是一个运算符,将在您的示例中对数组元素进行操作。

所以这三行是等价的:

p[int(nintervals*number)]++;
p[int(nintervals*number)] += 1;
p[int(nintervals*number)] = p[int(nintervals*number)] + 1;

因此++运算符不能在数组上运行;它在您编入索引的数组的元素上运行。我希望这很清楚。

现在,如果您将++运算符绑定到数组,如下例所示,那么结果操作就完全不同了。

(++p)[int(nintervals*number)];

这将增加指针p,然后索引到(p + 1)指向的内存中。该索引处的值不会更改,因此该代码的结果只是递增指针p。这可能是也可能不是你想要的。 可能没有,但只有在与我们分享您如何分配和分配指针p以及与其相邻的内存时才能确定。

答案 3 :(得分:1)

在评估之前,

++exp会增加exp 的值。它与exp++的不同之处在于后者评估exp并稍后递增。

在您的代码中,您正在访问数组中的元素并递增它。它可以通过两种方式重写:

p[int(nintervals*number)]++;
p[int(nintervals*number)] += 1;

为了更好地了解postfix和前缀++运算符之间的区别,请查看以下代码:

int a = 1;
if(a++ == 1){
    printf("yes");
}
else{
    printf("no");
}

此输出将为“yes”,因为它将首先评估布尔表达式,稍后将a递增。另一方面:

int a = 1;
if(++a == 1){
    printf("yes");
}
else{
    printf("no");
}

输出将为“no”,因为a将首先递增,然后将评估布尔表达式。

希望这有帮助!