[英]i+1 as opposed to i++
为什么i++
; 给我奇怪的随机数而不是i + 1
; 在 for 循环中? 我对编程很陌生,所以我想了解这里的区别。 我的猜测是i
以某种方式被覆盖,这使得编译器从内存中取出随机数。
#include <stdio.h>
int main() {
int arr[100];
for (int i = 0; i < 100; i++) {
arr[i] = i + 1; //why wouldn't i++ work?
}
return 0;
}
arr[i] = i+1;
很好,将i + 1
分配给arr
元素i
。
arr[i] = i++;
未定义的行为:在为arr[i]
读取i
和在i++
修改它之间没有顺序。 什么都可以。
i + 1
计算i
加1
的值。 它将i
值偏移1
。
i++
产生的电流值i
,但增量i
之后。 这会弄乱你的循环,有效地跳过地方。
这里的区别在于+
运算符不会改变任何一个值,而是生成一个新值,而++
运算符会更改它所附加的值。
i++
是后缀递增运算符,它增加该装置i
然后返回的旧值i
。 因此,在第一个循环中,您将 0 写入arr[0]
,然后i
将增加到1
,然后再次循环到2
,然后2
将写入arr[2]
,而i
将变为4
, 等等。 因此,每个其他值都将具有索引,而其他值将具有随机未初始化的内存。
鉴于此代码:
int arr[100]; for (int i = 0; i < 100; i ++) { arr[i] = i+1; //why wouldn't i++ work? }
...在循环体中用i++
代替i + 1
有两个问题:
计算表达式i++
更新的值i
,和计算表达式a[i]
读出的值i
。 由于您的赋值中这些表达式的计算相对于彼此是“无序的”,因此结果行为是未定义的。 这允许任何事情发生,而不仅限于选择一种或另一种评估顺序的影响。
假设 (1) 在给定的实现中不是问题——它提供了一个扩展,例如,指定赋值的左操作数的计算在该赋值的右操作数的计算之前进行排序。 在这种情况下,如果您仅通过将表达式i++
替换为循环体中的表达式i+1
来修改示例代码,那么结果是每次循环迭代时i
都会增加两次。 在这种情况下,您的循环只会为数组元素的一半赋值。 没有初始化器声明的局部变量的值在明确分配之前是不确定的。 读取未分配元素的值可能会产生任何结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.