免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: xxNote
打印 上一主题 下一主题

[C] 表达式arr[i++]中的[]运算符是在i的左边还是右边? [复制链接]

论坛徽章:
0
21
发表于 2014-10-15 19:01
测试结果是啥?

回复 19# xxNote


   

论坛徽章:
0
22 [报告]
发表于 2014-10-15 19:04 |只看该作者
fsfilove 发表于 2014-10-15 19:01
测试结果是啥?

回复 19# xxNote
  1. #include<stdio.h>

  2. int main(void)
  3. {   
  4.         int arr[5] = {0, 0, 0, 0, 0}, i = 0;

  5.         arr[++i] = arr[++i] + 1;
  6.         printf("%d\n", i);
  7.         for (i=0; i<5; i++)
  8.         {
  9.                 printf("%d ", arr[i]);
  10.         }

  11.         return 0;
  12. }
复制代码
测试结果就是这张图片

论坛徽章:
0
23 [报告]
发表于 2014-10-15 19:10 |只看该作者
那说明i被加了两次咯,你那种只有一次。
回复 22# xxNote


   

论坛徽章:
0
24 [报告]
发表于 2014-10-15 19:13 |只看该作者
fsfilove 发表于 2014-10-15 19:10
那说明i被加了两次咯,你那种只有一次。
回复 22# xxNote

嗯,所以说是arr[i++]这种的时候才有区别
原来的是
  1. #include<stdio.h>

  2. int main(void)
  3. {   
  4.         int arr[5] = {0, 0, 0, 0, 0}, i = 0;
  5.         /*
  6.         arr[++i] = arr[++i] + 1;
  7.         */
  8.         arr[++i] += 1;
  9.         printf("%d\n", i);
  10.         for (i=0; i<5; i++)
  11.         {
  12.                 printf("%d ", arr[i]);
  13.         }

  14.         return 0;
  15. }
复制代码

论坛徽章:
0
25 [报告]
发表于 2014-10-24 13:35 |只看该作者
7楼这样的态度不好吧,你不愿意回答就算了,这显然是嘲讽楼主的求知欲啊。

楼主我来说一下啊。

先说一下啊 arr[i++]与arr[++i] 是不一样的。  前者是执行完当前语句 i 再自增,后者是先自增再执行语句。  同样假设 i =0 ; 那么arr[i++] 就是 调用的arr[0],接下来 i 的值就是1了; arr[++1] 就是 调用arr[1]的, 接下来i的值也是1;  

楼主可以去试试
arr[++i]+=1;
printf("%d\n",arr[i]);  这里别再写++i 了 ,i的值已经变了,如果再自增就不对额了
printf("%d\n",arr[i-1]);

然后再改一下啊
arr[i++]+=1;
printf("%d\n",arr[i]);   
printf("%d\n",arr[i-1]);           


x +=1 等价 x = x +1 ; 这个是对的。

但是arr[++1] = arr[++1]+1 与 arr[++i] += 1; 不同的。   虽然我不太理解[]运算符遵循从左到右的原则这句话。。   

不过你看  arr[++1] = arr[++1]+1  这一句 。 ++i ,=号的左边和右边每一次都对 i 进行了自增,也就是前面说的,i的值已经变了,再自增就不对了额。 假设 i 的初值是0 ,你这一句就是arr[1] = arr[2] + 1;  

而  arr[++i] += 1  这一句  就是 arr[1] += 1; 等价于 arr[1] = arr[1] + 1  啊 。     

所以,如果一定要等价的话就是。 arr[++i] = arr[i] + 1;

好了就这么多了。我应该说的够明白了。。其他的情况楼主就自己去测试,自己理解吧。





论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
26 [报告]
发表于 2014-10-24 17:14 |只看该作者
回复 10# xxNote


    你二楼说的就是答案啊。比如a[i ++]这个表达式,求值一次i就增1,所以标准规定a += b这种情况a只求值一次。

论坛徽章:
0
27 [报告]
发表于 2014-10-26 08:36 |只看该作者
本帖最后由 haicg 于 2014-10-26 08:40 编辑

你的问题应该是一个优先级的问题,这个问题可以再编译原理-算符优先分析分析法中找到答案。
因为+= 的优先级是14,低于i++和[],所以编译器会翻译成先计算++i,然后把(++i) 的值进行[]操作,因为是通过栈来处理这个符号语法的,
所以内层先运算,所以会先(++i)后[],最后才会处理 +=操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP