|
void main() {int a[5]={1,2,3,4,5},b[5]={1,2,3,4,5},c[5]={1,2,3,4,5},*p=a,*q=b,*w=c; printf("\n\n%3d,%3d,%3d\n\n",*p,*q,*w); printf("\n\n%3d,%3d,%3d\n\n",*p++,*(q++),(*w)++); printf("\n\n%3d,%3d,%3d\n\n",*p,*q,*w); printf("\n\n%3d,%3d,%3d\n\n",a[1],b[1],c[1]); } 我想着,第一次全部输出1,1,1 第二次应该输出 1,然后p++,p改指向2; 2,q++指向2,然后输出q; 1,先得到*w,1,然后给1 ++得2;改变了c[1]; 这样的话,的三次输出应该是2,2,2 那么最后输出第一项时,应该是1,1,2,因为c[1]在第二次输出时被改变了。而且的三次输出的最后一个2,不是c[2],而是,c[1]; 可是,运行的结果并不是这样子,不知道为什么,故来求教! 我不是钻牛角尖,只是想通过它,了解一下× 与++的关系,谢谢各位! |
|
|
|
结果是该2 2 2啊。
你输出的是a[1],b[1],c[1],而不是a[0],b[0],c[0]!!! |
|
|
结果是:1,1,1
1, 1, 1 2, 2, 2 2, 2, 2 |
|
|
首先 * 优先级比++高!
第一行不用说了. 第2行输出,还应是p,q,w的"内容", 执行后p,w的内容加1,即a[0]=2,c[0]=2,q的内容不变,但指针位置加了1,指向a[1] 但p,w的位置不变 所以第3行输出:p,q,w的内容全是2 至于第4行,打印a[1],b[1],c[1],程序中都没有修改他们的内容,所以都是2, 注意,数组下标是从0开始的! 程序结果: 1 1 1 1 1 1 2 2 2 2 2 2 |
|
|
哦,失误,那第二次为什么不是1,2,1呢?
|
|
|
tc 2运行的结果是
1 1 1 1 1 1 2 2 2 1 1 2 |
|
|
因为是先输出值 1 之后,再由 1 变成 2 的
*(q++) 和 *(++q) 是不一样的 |
|
|
*(q++),是先取q的内容,然后等表达式执行完了,q指针加1,所以还是1
|
|
|
无论从分析,还是实践,结果都是
1 1 1 1 1 1 2 2 2 2 2 2 我的tc2.0运行就是这个结果 |
|
|
我懂了!
|
|
|
对,因为我写错了,最后我想输出的是a[0]b[0]c[0],错写成了a[1]....所以大家的都是2 2 2
抱歉 |
|
|
呵呵
改成 楼上 的 下标 0 就会得到 你 想要 的啦 |
|
|
我是个新手,我也不太懂ya ,为什么第2行不是1 2 1了
|
|
|
“*(q++),是先取q的内容,然后等表达式执行完了,q指针加1,所以还是1”
那么 *p++和 *(p++)有不就没什么不同么?是这意思么? |
|
|
是有不同:
* 优先级比++高 加()改变优先级 *p++,是先取p的内容,然后等表达式执行完,p的内容加1 *(p++),是指针p 的位置加1,而p的内容不变 |
|
|
楼上搞错了。
++ 比 * 优先。 *p++ 等效于 *(p++) 参考: 运算符 结合律 ( ) [ ] -> . 从左至右 ! ~ ++ -- (类型) sizeof 从右至左 * / % 从左至右 + - 从左至右 << >> 从左至右 < <= > >= 从左至右 == != 从左至右 & 从左至右 ^ 从左至右 | 从左至右 && 从左至右 || 从右至左 ?: 从右至左 = += -= *= /= %= &= ^= 从左至右 |= <<= >>= |
|
|
收到,我这下明白了,谢谢各位,无论错于对,只有讨论实践后才明白,这下,不会在混淆了。谢谢,非常感谢各位,虽说问题不大,但是高明白了还是蛮高兴的!
|
|
|
经过讨论,尽管自己错了,但还是学到了不少东西,谢谢!
|
|