a/=b++ ;
a/=b++ ;
为什么是先处理 a/=b ; 再处理 b++;
/= 优先权不是低于 ++ 吗??
谢谢
问题点数:5、回复次数:33Top
1 楼dazhuzhuerduo(大猪猪耳朵)回复于 2005-11-25 08:35:26 得分 0
b++的这种写法含义是先用b的原来值参与运算,然后再加1Top
2 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2005-11-25 08:36:47 得分 5
但是++后缀
虽然先处理了b++, b值自增一了, 但在表达式中(b++)表达式的值仍是未自加之前的值
因此效果就相当于 a /= b; ++b;
也可以这么理解
a /= b++;
相当于
c = b;
++b;
a /= c;
这段代码与
a /= b;
++b;
在执行结果上是没有区别的.
如果写成 a /= a++; 这种表达式的结果就令人费解了,Top
3 楼csucdl(csucdl)回复于 2005-11-25 08:37:32 得分 0
a /= b++
右边b++ 是一个表达式, 占用了临时空间假设为x, 则 x == b;
所以 a == a / x;
然后 b = b + 1;Top
4 楼goodluckyxl(被人遗忘的狗)回复于 2005-11-25 08:37:48 得分 0
是 ++ 优先级高
难道a/=b
然后再 a++?
Top
5 楼laoren_80(老车站)回复于 2005-11-25 08:46:45 得分 0
a/=b++ ;
为什么是先处理 a/=b ; 再处理 b++;
/= 优先权不是低于 ++ 吗??
----------------------------------------
b++的意思是先把b进行表达式的运算在++
如果换成++b就不一样了Top
6 楼xinlingwuyu(**用代码诠释生命**)回复于 2005-11-25 08:53:01 得分 0
支持!
Top
7 楼shihyuyao(深水聲道)回复于 2005-11-25 08:53:27 得分 0
謝謝各位大大解惑
我大概了解Top
8 楼wangli3274(王丽)回复于 2005-11-25 09:01:54 得分 0
个人认为xiaocai0001(萧筱雨)已经说得很清楚了。
就如:
void main()
{
int a=1;
printf("%d",a++);
}
结果仍是:1
并不是a++未进行处理,而是,处理之后下一次用的时候才改变,当前a值仍未改变,这就是a++与++a的区别。
Top
9 楼zkingsun()回复于 2005-11-25 12:09:58 得分 0
a/=b++ ;
b是在表达式完了后执行++运算的
上面的说得很清楚了Top
10 楼chen_fu(精灵东东)回复于 2005-11-25 15:07:01 得分 0
a /= b++;
a /= ++b;
b++先用后加,即:a/=b;b++;
++b先加后用,即:++b; a/=b;Top
11 楼busishusheng(不死书生)回复于 2005-11-25 15:46:47 得分 0
先算a=a/b再算b=b++Top
12 楼wucloudy(跳跳云)回复于 2005-11-25 15:50:18 得分 0
b++的这种写法含义是先用b的原来值参与运算,然后再加1
所以,如果这个时候b=5那么,在做a/=b的时候b是5,而作完这条完整的语句之后b=6了,和他的优先级没有关系Top
13 楼shihyuyao(深水聲道)回复于 2005-11-25 18:41:39 得分 0
a/=b++;
a/=++b;
有点乱掉
还是跟后缀++ & ++前缀有关系
这跟 /= ,++ 优先顺序有关吗??
Top
14 楼lovefreex(笨わ孩)回复于 2005-11-25 18:47:30 得分 0
不知道就用括号,呵呵~`Top
15 楼aucs518(专注DOTNET~)回复于 2005-11-25 21:58:59 得分 0
void main()
{
int a=4,b=1;
printf("%d",a/b++);
printf("%d",a/++b);
}
比较一下就明白了Top
16 楼ErikChen1985()回复于 2005-11-25 22:27:12 得分 0
这些代码一点意义都没有,干吗要写一些这样令人费解的代码啊!Top
17 楼cocopww(春天我把老婆种下去,秋天我就有好多好多老婆啦)回复于 2005-11-26 01:23:25 得分 0
估计没人会把代码写成这样。。
不过 问题还是值得想想
a/=++a; //a++换成了++a
——>结果还是先 ++a 在 a/=++a吗?Top
18 楼m0792(索富特微儿(SOFTWARE))回复于 2005-11-26 01:34:18 得分 0
要理解++i 与 i++
++i 是先算加在运算
i++ 是先运算在加啊
就是说i++是先用i运算在使i+1;而++i是先做自加,就是先使i的值加一在进行别的运算~!
Top
19 楼cunsh(村少)回复于 2005-11-26 01:45:32 得分 0
xiaocai 说清楚了.
后缀++ 返回的是一个临时的const 的值.Top
20 楼billjoy(虫虫头低低)回复于 2005-11-26 13:33:47 得分 0
应该和编译器的也有点关系!Top
21 楼ilovedudu(void *)回复于 2005-11-26 15:29:14 得分 0
7: a /= a++;
0040102F mov eax,dword ptr [ebp-4]
00401032 cdq
00401033 idiv eax,dword ptr [ebp-4]
00401036 mov dword ptr [ebp-4],eax
00401039 mov eax,dword ptr [ebp-4]
0040103C add eax,1
0040103F mov dword ptr [ebp-4],eax
想问一下 cdq 是什么意思?Top
22 楼jiazichenzhan(毛毛)回复于 2005-11-26 15:45:12 得分 0
学习中……Top
23 楼zw24127(政委)回复于 2005-11-26 16:18:38 得分 0
a/=b 假若b是一表达式的话,先算表达式的值,再算a/b的值.
@= 是先算=右边的值,再算@运算的!!!!Top
24 楼shiao2005(Shiao)回复于 2005-11-26 17:42:58 得分 0
a/=b++ ;
等价于
a = a / (b++);
Top
25 楼xsm(程序)回复于 2005-11-26 18:47:59 得分 0
a/=b++;
1:b++;
2: a=a/b;
Top
26 楼overcomeunicom_xu(chaoshan)回复于 2005-11-26 21:40:51 得分 0
没必要说得这么复杂
单运算操作符及=操作符其结合是从右向左
其余操作符从左到右
a/=b++;
++为单运算符,那么a/=b++;<==>a/=(b++);Top
27 楼nonlyli(Perfect.Li)回复于 2005-11-26 22:34:37 得分 0
前几天正好跟朋友聊这个问题,总是似乎明白,又似乎有些问题。
今天彻底分析小结了一下,反汇编后的代码说明问题。
关键问题在于,a /= b++,虽然是++先运算,但++是先用值,后++
自增1的操作,在整个表达式完成之后才会执行。
如果还不清楚,看今天新的blog,附了代码:
http://nonlyli.host.9466.cn/blog/post/C_self_plus.htmlTop
28 楼leona404(李思)回复于 2005-11-26 23:55:24 得分 0
搞清楚b++跟++b的区别就会明白了Top
29 楼herryhuang(Herry)回复于 2005-11-27 00:38:40 得分 0
if (b == 0)
{
shit!!!
}Top
30 楼bombwang(王)回复于 2005-11-27 08:53:00 得分 0
学习Top
31 楼creative55(hansonlu)回复于 2005-11-27 10:47:01 得分 0
这种问题需要拿来讨论吗?shitTop
32 楼homtipo()回复于 2005-11-27 16:05:56 得分 0
这是和编译器有关系的。 没有什么意思呀讨论这种题目。 现在等级考试都很少考了。Top
33 楼gitolf()回复于 2005-11-27 16:49:20 得分 0
执行b++后,b的值加1了,然而b++这个表达式的值还是原来的值,表达式和变量的值是不同的!Top




