关于C语言结合性

来源:百度知道 编辑:UC知道 时间:2024/09/23 14:07:29
定义我明白 不用解释~~~
就题说~~
int a=2,*p=&a,*q=&a;
ptintf("%d %d",*p++,*(q++));
p=&a,q=&a;
printf("%d %d",*p,(*q)++);

我有几个疑问 ++ --是右结合而且和指针运算符优先级相同,
那么*p++和*(p++)应该是一样的啊~~,
可是老师却说 *p++是a++,*(q++)才是地址++

还有,下面那个printf("%d %d",*p,(*q)++);老师说从右向左算,就是先算(*q)++再算*p~~为什么啊?
对了~~还有老师讲*(q++)先算*q然后地址再++~~~
我晕~~!!

你们老师误人子弟,你理解的对,*p++和*(p++)是一样的。你可以自己动手试试。
int a=2,*p=&a,*q=&a;
printf("%p,%p\n",p,q);
printf("%d %d\n",*p++,*(q++));
printf("%p,%p,%d\n",p,q,a);

打印出来可以看到执行 *p++ 后,是地址++,a并没有变化。

*(q++)先算*q然后地址再++ 是完全正确的。++ 规定在变量右面时,变量先参与运算,在加1,所以是先算*q然后地址再++

printf("%d %d",*p,(*q)++);老师说从右向左算,就是先算(*q)++再算*p,不完全准确,应该是先算 *q,再算*p,再算 (*q)++

@@@@@@@@@@@@@@@@@@
【规则】关于自增自减运算,很多书籍没有把问题讲清楚,在C语言里是这样的:

1.后置运算:k++表示先运算,后自加。
意思是遇到k++了,我先把当前的k的值拿来参加运算,后面再去管它的自加。
那么,【“后面”后到什么程度呢?要后到当前的语句执行完,即遇到分号;表示
语句执行完了,所以k才自加1。】

2.前置运算:++k表示先自加,后运算
这个意思就是遇到++k了,先把k的值加了1,再往后执行别的。

掌握好这两点,k--和--k也是一样的道理。

3.++、--是的运算方向都是,从右往左。

@@@@@@@@@@@@@@@@@@
这里:
1.*p++和*(p++)都是一样的。
分析:
因为取地址运算符“*”和增量运算符“++”,而且是同级运算。按理说同级运算
从左向右结合!(你们老师讲的就是这个规则,得出的结论是*p++是a++,
*(q++)才是地址++ )。
但是,请记住,这里*p++不适用这个规则!++和 *运算