我有这段代码:
for(i=0;i<10000;i++){
double number=distribution(generator);
++p[int(nintervals*number)];
}
但我不知道++如何影响数组。任何人都可以解释这个吗?
答案 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
将首先递增,然后将评估布尔表达式。
希望这有帮助!