关于一条语句的执行顺序

大佬么,关于下面两种写法有什么区别呢,为什么第二种会数组索引越界呢?

for (int i = 0; i < nums.Length;)
{
    // 第一种写法
   nums[i++] = nums[i] + 1;
   i++;
    // 第二种写法
   nums[i++] = nums[i] + 1; 
}


            

哈哈。很明显,对于第二种写法我上面的评论已经说了。第一种写法,就是单纯的数组每一位都加1,然后i++只是起一个循环的作用。

第二种,比如i=0时是nums[0]=nums[1]+1,i=1时是nums[1]=nums[2]+1。

而且,当i=nums.length-1的时候,变成了nums[nums.length-1] = nums[nums.length]+1不就越界了。

你错了,都会越界。

先讨论赋值语句:如果i是num.length-1,执行num[i++] = num[i]+1的时候变成了num[num.length-1] = num[num.length]+1就越界了

这就已经越界了。所以我说的两种都是越界的。

但是,数组的个数是奇数还是偶数就又不一样了。

如果是偶数比如6,第一种,for大括号内的i只会是0,2,4,所以num[4] = num[5]+1完全是正确的。

第二种,for大括号内的i可以是0,1,2,3,4,5,所以num[5] = num[6]+1越界

如果是奇数比如5,第一种,i = 0,2,4,num[4] = num[5]+1越界

第二种,i = 0,1,2,3,4,num[4] = num[5]+1越界。

两种写法都一样,区别是中间的i++,我想问一下,i++归属第一种写法还是第二种写法?

因为i ++是单目运算符,会先运行,所以后面的a [i ]+1比前面的i更大了

如果是归属第一种写法,那么数组就不会越界;

如果是归属第二种写法,那么数组就会越界。

第二种写法,当i已经是最后一个索引位置了,然后对i再进行一次++操作,i就已经超出索引范围了,数组在进行使用就越界了。

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

for (int i = 0; i < nums.Length;)
{
    // 第一种写法
   nums[i] = nums[i] + 1;
   i++;
    // 第二种写法
   nums[i++] = nums[i] + 1; 
}

不好意思各位,上面的代码写错了

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html