免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 3280 | 回复: 20
打印 上一主题 下一主题

讨论,由华为一试题而来! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-25 12:00 |只看该作者 |倒序浏览
int arr[]={0,1,2,3,4,5,6,7,8,9,10,11,12};
        int *ptr=arr;
        int ia,ib,ic;
        (ia=5,ib=4,ic=3,ic)=(ia=16,ib=17,ic=18,ic);
        //先操作表达式的左边在是右边!
           //而不是按数学思维的将等式右边赋给等式左边!
        *(ptr++)=*(ptr++)+16; //我认为a[0]=a[1]+16=17;实际a[0]=a[0]+16=16;
        *(++ptr)=*(++ptr)+16; //我认为a[3]=a[4]+16=20;实际相同
        *(++ptr)=*(ptr++)+16; //我认为a[5]=a[5]+16=21;实际相同
        *(ptr++)=*(++ptr)+16; //我认为a[6]=a[8]+16=24;实际a[6]=a[7]+16=23;
        *(ptr++)=*(ptr++)+16; //我认为a[8]=a[9]+16=25;实际a[8]=a[8]+16=24;
        printf("%d,%d,%d",*ptr++,*(++ptr),*(++ptr));
//                输出:12,12,11
以上在GCC环境得出。

论坛徽章:
0
2 [报告]
发表于 2006-03-25 12:07 |只看该作者
int arr[]={0,1,2,3,4,5,6,7,8,9,10,11,12};
        int *ptr=arr;
        int ia,ib,ic;
        (ia=5,ib=4,ic=3,ic)=(ia=16,ib=17,ic=18,ic);
        //先操作表达式的左边在是右边
           //而不是按数学思维的将等式右边赋给等式左边!
        *(ptr++)=*(ptr++)+16; //我认为a[0]=a[1]+16=17;实际a[0]=a[0]+16=16;
        *(++ptr)=*(++ptr)+16; //我认为a[3]=a[4]+16=20;实际相同
        *(++ptr)=*(ptr++)+16; //我认为a[5]=a[5]+16=21;实际相同
        *(ptr++)=*(++ptr)+16; //我认为a[6]=a[8]+16=24;实际a[6]=a[7]+16=23;
        *(ptr++)=*(ptr++)+16; //我认为a[8]=a[9]+16=25;实际a[8]=a[8]+16=24;
        printf("%d,%d,%d",*ptr++,*(++ptr),*(++ptr));
//                输出:12,12,11




真的假的。我是没写过,但是结果很奇特

论坛徽章:
0
3 [报告]
发表于 2006-03-25 12:10 |只看该作者
这种问题没有讨论的价值和意义.华为出这种题目BT了.鉴定完毕

论坛徽章:
0
4 [报告]
发表于 2006-03-25 13:54 |只看该作者
C/C++标准中,未规定赋值语句的求值顺序(可能先求等号左也可能先求等号右)
所以类似++这种有副作用的东东用在赋值中,其结果只能是未定义,依赖于具体的
编译器实现

论坛徽章:
0
5 [报告]
发表于 2006-03-25 14:03 |只看该作者
我运行一下再来

论坛徽章:
0
6 [报告]
发表于 2006-03-25 14:13 |只看该作者
(ia=5,ib=4,ic=3,ic)=(ia=16,ib=17,ic=18,ic);

上面的这行啥意思?

论坛徽章:
0
7 [报告]
发表于 2006-03-25 14:18 |只看该作者
结果正确,怎么回事?

论坛徽章:
0
8 [报告]
发表于 2006-03-25 14:29 |只看该作者
原帖由 converse 于 2006-3-25 12:10 发表
这种问题没有讨论的价值和意义.华为出这种题目BT了.鉴定完毕


同感!
而且,一般的编程规范都禁止一个语句多个运算操作,如*p++等。

论坛徽章:
0
9 [报告]
发表于 2006-03-25 14:47 |只看该作者
原帖由 ganqing1234 于 2006-3-25 14:13 发表
(ia=5,ib=4,ic=3,ic)=(ia=16,ib=17,ic=18,ic);

上面的这行啥意思?


哪位大侠告诉我

论坛徽章:
0
10 [报告]
发表于 2006-03-25 15:42 |只看该作者
逗号表达式,这个规定了运算顺序,从左至右
算完一个结果就丢弃了,最后那个才是表达式的结果(当然前面的语句可能影响变量的值)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP