回 帖 发 新 帖 刷新版面

主题:指针问题

、若有以下的定义:
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个回复)

沙发

又是考运算符优先级的吧。
逗号运算符优先级最低。
自增没有取值(址)优先级高。

后自增返回的是自增前的值,前自增返回的是自增后的值。

所以。第一个:)

板凳


可是A那个不是有个括号嘛~难道不提升优先级,

3 楼

昨天看脚本优先级的时候我偶然间也想到这个问题。(以前学习不扎实)
我这么想的,也请那几位风骚的大牛指点下。嘿嘿、
p++;先产生p的一份拷贝,p再自增。所以,即使*(p++),由于优先级的原因。还是先操作*p,然后p = p + 1;这和*p++一个故事。另:一直受大一教材所误导,没有理解。。

4 楼

[quote]所以,即使*(p++),由于优先级的原因。还是先操作*p,然后p = p + 1;这和*p++一个故事。另:一直受大一教材所误导,没有理解。。
[/quote]
你在瞎说吧,p++ 是 自身加一,但返回原先的值,伪代码如下
temp = p;
++p;
return temp;

5 楼

我是这样理解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()的计算顺序无法确定,不过*运算会先于+运算
        

我来回复

您尚未登录,请登录后再回复。点此登录或注册