鱼C论坛

 找回密码
 立即注册
查看: 4180|回复: 10

C的一个问题,求解答……

[复制链接]
发表于 2012-8-16 15:00:33 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 Potato丶 于 2012-8-16 18:22 编辑

初学C。。。献上问题一枚。

#include <stdio.h>
void main()
{
         int i=5,j=5,p,q;
         p=(i++)+(i++)+(i++);
         q=(++j)+(++j)+(++j);
         printf("%d,%d,%d,%d",p,q,i,j);
}

书上解释说:
这个程序中,对P=(i++)+(i++)+(i++)应理解为三个i相加,故P值为15。然后i再自增1三次相当于加3故i的最后值为8。而对于q 的值则不然,q=(++j)+(++j)+(++j)应理解为q先自增1,再参与运算,由于q自增1三次后值为8,三个8相加的和为24,j的最后值仍为8。

可是为毛编译结果P确实等于15.Q却等于22。。求解答……

最佳答案

查看完整内容

这和书本上讲的可完全不一样哦。在学校的时候,用同学的机器和自己的机器 其结果就会出现不同。可能是编译器的版本不同。。标准上也不推荐用此表达式连用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-16 15:00:34 | 显示全部楼层
这和书本上讲的可完全不一样哦。在学校的时候,用同学的机器和自己的机器 其结果就会出现不同。可能是编译器的版本不同。。标准上也不推荐用此表达式连用

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
Potato丶 + 5 + 5 + 2 谢谢解答。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-16 15:50:54 | 显示全部楼层
不必纠结值为多少,因为此表达试的值是不确定的。机器不同结果可能不同:编译器不同结果可能不同哦。
{:1_1:}。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-16 16:17:29 | 显示全部楼层

窝曹这么操蛋?害我纠结好半天……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-16 17:47:50 | 显示全部楼层
这可不是什么好的代码风格,理解i++和++i的区别就可以了,不必纠结于这个,2楼的话有道理

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
Potato丶 + 5 + 5 + 2 赞一个!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-16 18:27:39 | 显示全部楼层
本帖最后由 hy19970612 于 2012-8-16 18:37 编辑

这个  问题 可以 是这样解答  我的想法不一定正确只做参考

首先 p=(i++)+(i++)+(i++);
hy19970612.png
我测试过了 在linux 下GCC 编译 答案 也是一样的,如果 你的平台是win vc 那么 就可以基本断定与平台无关,与编译器无关
我想可以这样解释  虽然 括号 优先级最大 但是 i++ 是把值先返回 再做运算 这个特性 是括号 没办法解决的 括号的特点只是 让扩号里面的表达式 先运算 但是 i++ 的 运算方式 是先把值返回给右值 再运算
附带本人  推算过程
过程
p=(i++)+(i++)+(i++);
p=5+5+5  ;
i=i+1;
i=i+1;
i=i+1;
那么 ++j 是先做运算再把值给返回 其实 你可以验证下答案 代码如下
#include<stdio.h>

void main(){
        int i=5,p;
        p=(i++);// 简化一下 这个语句 
        printf("%d,%d\n",p,i);
}
这样就可以验证我的答案
还有 我的鱼币不少了 都拿起拍书了 下次不要说我鱼币少

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
Potato丶 + 5 + 5 + 2 嘿嘿- -

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-16 19:50:59 | 显示全部楼层
hy19970612 发表于 2012-8-16 18:27
这个  问题 可以 是这样解答  我的想法不一定正确只做参考

首先 p=(i++)+(i++)+(i++);

我主要想知道q怎么算出来的22。。
我刚研究了下发现有两个(++j)相加。其值肯定是2倍的j+2.后面就正常了。
比如说int j=5,q;
   q=(++j)+(++j);   这样的话q=14   j=7
   q=(++j)+(++j)+(++j);   这样的话q=14+8=22   j=8
   q=(++j)+(++j)+(++j)+(++j);   这样的话q=14+8+9=31  j=9
   q=(++j)+(++j)+(++j)+(++j)+(++j); 这样的话q=14+8+9+10=41  j=10

以此类推。。只有前两个不对头。本应该是6+7=13的。不知道为什么会出来14咩。     
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-17 10:28:14 | 显示全部楼层
为什么老是纠结这些东西呢? 虽然真有写显得你逻辑清晰,但你觉得现在的中药说明书会是文言文吗?
多加几行让代码代码通俗易懂不好吗?

点评

- -这只是个例题咩……  发表于 2012-8-17 11:10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-17 13:38:57 | 显示全部楼层
Potato丶 发表于 2012-8-16 19:50
我主要想知道q怎么算出来的22。。
我刚研究了下发现有两个(++j)相加。其值肯定是2倍的j+2.后 ...

22是因为编译器先算出的是前面两个,然后加8,前面两个都是7。不同的编译器结果会不一样。但是只会出现两种结果 要么就是7+7+8, 要么就是8+8+8。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
Potato丶 + 5 + 5 + 2 赞一个!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-17 18:38:52 | 显示全部楼层
本帖最后由 hy19970612 于 2012-8-17 18:40 编辑
Potato丶 发表于 2012-8-16 19:50
我主要想知道q怎么算出来的22。。
我刚研究了下发现有两个(++j)相加。其值肯定是2倍的j+2.后 ...


是这样滴  
首先 有大括号了 对吧
q=(++j)+(++j);
q=j+7(j);// 为什么 会这样呢 其实 就是 括号的优先级了 首先 ++j 然后等于6 这时 优先级 在于 第二个 大括号 记得 j是个变量 不是常量 然后 第二个 括号的j自增1 然后 J 就变成了 7 然后 最后 是相加  记得 只有一个 变量 所以 一个变量里 不会出现两个 值  步骤的 最后 才是 j+j 所以 等于 14  
2.
q=(++j)+(++j)+(++j);
q=28,j=10
这里 我用 VC 反汇编了下
看到 他是 先把前面的自增 就是 按照 第一个 表达式一样 然后  
j+j;这里 已经把计算好的 值给了 一个寄存器 所以等于 这里 已经是 j=9,9+9=18
j++;j=10 q=18+10; 剩下的 自己 思考把! 大概 就是这个思路 下面的我没看 我也不知道
反汇编第二个表达式
QQ截图20120817183633.png
最终的结果
QQ截图20120817184240.png

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
Potato丶 + 5 + 5 + 2 哎呀。不用纠结了- -感谢咩……

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-17 20:36:22 | 显示全部楼层
好像考试时就就考这个诶 = =#

点评

- -知道怎么算等于几就行了咩…………  发表于 2012-8-18 10:57
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-15 22:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表