在C++数组之前添加'++'时会发生什么?
What happens when adding '++' before array in C++?
我有这段代码:
for(i=0;i<10000;i++){
double number=distribution(generator);
++p[int(nintervals*number)];
}
但我不知道++如何影响数组。有人能解释一下吗?
它将递增内存中用int(nintervals*number)
索引的数组元素的值。这相当于
++( p[int(nintervals*number)] );
| _______________________/
| |
| V
| Array element is evaluated first
|
V
then ++ operator increment that array element
++
只是一个运算符,将在您的示例中对数组元素进行操作。
所以这三行是等价的:
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
及其相邻内存时才能确定。
运算符
的优先级使该代码等效于:
++(p[int(nintervals*number)]);
也就是说,预增量适用于数组中该位置的元素,而不是数组本身。
++exp
在评估之前递增exp
的值。它与exp++
的不同之处在于,后者评估exp
,后来递增。
在代码中,您正在访问数组中的元素并将其递增。它可以通过另外两种方式重写:
p[int(nintervals*number)]++;
p[int(nintervals*number)] += 1;
为了更好地了解后缀和前缀++
运算符之间的区别,请查看以下代码:
int a = 1;
if(a++ == 1){
printf("yes");
}
else{
printf("no");
}
此输出将为"yes",因为它将首先计算布尔表达式,然后a
将递增。另一方面:
int a = 1;
if(++a == 1){
printf("yes");
}
else{
printf("no");
}
输出将为"否",因为a
将首先递增,然后计算布尔表达式。
希望这有帮助!
相关文章:
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 我还可以添加什么来按空格或空格正确拆分C++字符串?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 我正在尝试制作一个程序,在添加 n 天(整数)后告诉一个人什么是一天(例如星期一等)
- 有什么方法可以将元素添加到列表中,如图所示?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 在QT中为小部件添加彩色边框的最佳方法是什么
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- CSUF EPP - 你有什么想法(在添加到链接列表末尾时遇到麻烦)
- 是什么使这个以'+'开头的字符串添加成为有效的语句?
- zlib 添加的各种类型的目的是什么,我如何使用它们?
- 我应该在服务模板中的什么位置添加自己的代码?
- 计算机使用什么方法添加无符号整数
- 在下面函数的返回中添加 const 限定符的重要性是什么?
- HTTPADDREQUESTHEADERS添加的标头与HttpsendRequest发送的标题有什么区别
- "-I" 和 "-L" 在添加到路径前面时是什么意思?
- 在所有程序中,在Visual Studio中添加OpENCV的一般方法是什么?
- 添加 DIV/0 异常处理。我做错了什么,但无法确定在哪里