问题描述
为什么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;
}
解决方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveOnCurvedLine : MonoBehaviour
{
public LineRenderer lineRenderer;
public GameObject objectToMove;
public float speed;
public bool go = false;
public bool moveToFirstPositionOnStart = false;
private Vector3[] positions;
private Vector3[] pos;
private int index = 0;
// Start is called before the first frame update
void Start()
{
pos = GetLinePointsInWorldSpace();
if (moveToFirstPositionOnStart == true)
{
objectToMove.transform.position = pos[index];
}
}
Vector3[] GetLinePointsInWorldSpace()
{
positions = new Vector3[lineRenderer.positionCount];
//Get the positions which are shown in the inspector
lineRenderer.GetPositions(positions);
//the points returned are in world space
return positions;
}
// Update is called once per frame
void Update()
{
if (go == true)
{
Move();
}
}
void Move()
{
objectToMove.transform.position = Vector3.MoveTowards(objectToMove.transform.position,pos[index],speed * Time.deltaTime);
if (objectToMove.transform.position == pos[index])
{
index += 1;
}
if (index == pos.Length)
index = 0;
}
}
精细,它将arr[i] = i+1;
分配给i + 1
中的元素i
。
arr
未定义行为:
在为arr[i] = i++;
读取i
到在arr[i]
中对其进行修改之间没有顺序。一切都会发生。
i + 1
计算i
加上1
的值。它将i
的值偏移1
。
i++
产生当前值i
,但之后立即增加i
。这样会弄乱您的循环,有效地跳过了地方。
此处的区别在于+
运算符不更改任何一个值,而是产生一个新值,而++
运算符更改其附加值。
i++
是后缀递增运算符,这意味着它递增i
然后返回旧值i
。因此,在第一个循环中,您将写入0到arr[0]
,然后将i
递增到1
,然后再次由循环到2
,然后是{{ 1}}将被写入2
,而arr[2]
将成为i
,依此类推。因此,每个其他值将具有索引,而其他值将具有随机的未初始化内存。
给出以下代码:
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
来修改示例代码 only ,则结果是i
被递增每次循环重复两次。在这种情况下,循环只会为数组元素分配一半的值。在没有显式分配器的情况下声明的局部变量的值是不确定的。读取未分配元素的值可能会产生任何结果。