主题:指针问题
nick_hu
[专家分:0] 发布于 2011-08-09 14:40:00
、若有以下的定义:
int a[]={1,2,3,4,5,6,7,8,9,10},*p=a
则值为3的表达式是
p+=2,*(p++)
p+=2,*++p
p+=3,*p++
p+=2,++*p
希望大牛们说下原因;
回复列表 (共5个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-08-09 15:12:00
又是考运算符优先级的吧。
逗号运算符优先级最低。
自增没有取值(址)优先级高。
后自增返回的是自增前的值,前自增返回的是自增后的值。
所以。第一个:)
板凳
nick_hu [专家分:0] 发布于 2011-08-09 17:02:00
可是A那个不是有个括号嘛~难道不提升优先级,
3 楼
fragileeye [专家分:1990] 发布于 2011-08-09 19:34:00
昨天看脚本优先级的时候我偶然间也想到这个问题。(以前学习不扎实)
我这么想的,也请那几位风骚的大牛指点下。嘿嘿、
p++;先产生p的一份拷贝,p再自增。所以,即使*(p++),由于优先级的原因。还是先操作*p,然后p = p + 1;这和*p++一个故事。另:一直受大一教材所误导,没有理解。。
4 楼
bruceteen [专家分:42660] 发布于 2011-08-10 08:24:00
[quote]所以,即使*(p++),由于优先级的原因。还是先操作*p,然后p = p + 1;这和*p++一个故事。另:一直受大一教材所误导,没有理解。。
[/quote]
你在瞎说吧,p++ 是 自身加一,但返回原先的值,伪代码如下
temp = p;
++p;
return temp;
5 楼
windy0will [专家分:2300] 发布于 2011-08-11 12:55:00
我是这样理解c语言的表达式的:
1. 表达式的唯一作用就是 产生副作用,没副作用的表达式无效。
2. 表达式可以分为几个子表达式,对副作用没贡献的子表达式无效。
3. 表式的值是用来帮助分析表达式的中间值,没有其他作用。
4. 子表达式的值依赖于 某个副作用的产生的时刻,则这将是一个 未定义行为.
5. 表达式的所有副作用相互独立(产生没有先后顺序),否则这是一个 未定义行为.
1>. *p++这个表达式等价于*(p++).因为只有1个副作用p++,实际上*号部分是无效的。
2>. q=*p++;这个表达式可以分解为3个子表达式,e1:p++ e2:*e1 e3:q=e2 ;2个副作用
这个表达式很显然e1 e2 e3对副作用q=e2有贡献,这3者均有效
副作用p++ 和 副作用q=e2 这两者发生的顺序没关系,没有违反第5点
e1 e2 e3的值不管这2个副作用何时发生,它们的值都是确定的.没违反第4点
3>. p=p++ 分解为e1:p++ e2:p=e1 ; 有2个副作用p++ p=e1
p++有1个副作用,并且p++的值为未执行副作用前的值,不依赖这2个副作用
但是这两个副作用不是相互独立的,它们会根据发生顺序不同,最后的效果不
同, 这就是未定义行为
如果p最开始为x,(1)先发生p++,再p=e1的最终效果为p=x;
(2)先发生p=e1,再p++的效果为p=x+1.
4>. q=p++ + p; 分解为e1:p++ e2:e1+p e3:q=e2 , 2个副作用
由于e2的值依赖于副作用p++发生的时刻,因此这也是 未定义的行为。
如果最开始p=x,(1)先发生副作用p++,再求e2,这e2的值为x+(x+1);
(2)先求e2,再发生副作用p++,则e2的值为x+x;
5>. 运算符?: , && || 这几个有点特殊。因为相应的在? , && ||这些位置副作用是能
确定的
6>. 优先级 结合顺序 并不表示求值顺序。
x=f()+g() f() g()的计算顺序是无法确定
x=f()*g() + h() f() g() h()的计算顺序无法确定,不过*运算会先于+运算
我来回复