鱼C论坛

 找回密码
 立即注册
查看: 5793|回复: 16

有两道 c入门习题 想求助

[复制链接]
发表于 2012-9-5 15:54:43 | 显示全部楼层 |阅读模式
11鱼币
源代码 是这样的  
是小甲鱼 c语言课件的例题
#include “stdio.h”
void main()
{
   int i = 5, j = 5, p, q;
p=(i++)+(i++)+(i++);
q=(++i)+(++i)+(++i);

printf("%d,%d,%d,%d",p,q,i,j);

}
我的电脑 是 64win7  我在虚拟机xp环境下用 vc 6.0 编译的  的的答案是

15,22,8,8


我很不理解 我  打的没错呀 ( 检查了好多遍 )
不知道 答案对不  为什么是  p=15 q=22

还有 就是 小甲鱼 在讲 逗号表达式时



#include <stdio.h>
void main()
{
      int a=2, b=4, c=6, x, y;
      y = (x=a+b), (b+c);
      printf("y=%d,x=%d", y, x);
}
这个的  结果 y不是  (b+c)的值


#include <stdio.h>
void main()
{
      int a=2, b=4, c=6, x, y;
      y = ((x=a+b), (b+c));
      printf("y=%d,x=%d", y, x);
}
这样编译的才是呀????

难道 你们 也是 这样的的吗???



小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-5 15:54:44 | 显示全部楼层
  1. /****************第一个***********************/
  2. #include<stdio.h>        //当调用标准库 文件 最好用 <> 包含头文件

  3. void main()
  4. {
  5.     int i = 5, j = 5, p, q;               
  6.         p=(i++)+(i++)+(i++);                //这里 因为是后置运算 所以先运算 p=5+5+5 =15  然后i 自增3次  i=8
  7.         q=(++j)+(++j)+(++j);                //这里 因为是前置运算 所以要先自增 又因为 这里可以写成 q=((++j)+(++j))+(++j) 所以i先自增2次 q=7+7=14 j=7
  8.                                                                 //这时候 q=14+j(j=7)  这时候j 再自增一次 所以最后结果为  q=14+8=22  j=8
  9.                
  10.         printf("%d,%d,%d,%d",p,q,i,j);                        //所以 p=15 i=8 q=22  j=8
  11.        
  12. }
  13. /******************************************/


  14. /***********第二个**************************/
  15. #include <stdio.h>

  16. void main()
  17. {
  18.        int a=2, b=4, c=6, x, y;
  19.        y = (x=a+b), (b+c);                // 赋值运算符高于逗号运算符  所以把x=a+b运算出来就直接赋值给 y  然后在计算b+c的值
  20.        printf("y=%d,x=%d", y, x);                //所以 y=6  x=6
  21. }
  22. /*****************************************/


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-5 16:35:27 | 显示全部楼层
第一个小甲鱼说了,不同的编辑器,不同的环境下,甚至C预言和C++结果都是不同的。这个没什么好纠结的。
第二个我和小甲鱼老师的答案也不一样。貌似要加个括号 y =( (x=a+b), (b+c)),大概吧,忘记了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-5 19:35:11 | 显示全部楼层
第一个问题不用纠结,不同的环境会不一样,也没什么好研究的,这种题目的初衷是让你知道这种编程风格
不好。
第二个问题是因为赋值运算符的优先级大于逗号运算符,如果不加括号就是a+b的值。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-5 21:49:10 | 显示全部楼层
不同的编辑器,不同的环境下,甚至C预言和C++结果都是不同的。这个没什么好纠结的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-5 22:45:50 | 显示全部楼层
我也刚看到这里,弄到死都弄不出。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-5 22:51:24 | 显示全部楼层
我第一个算到是 15,,33,11,5.第二题倒跟你一样。我用的是XP系统、win-tc,主要是感觉这个新建文件方便,没视频上面那么麻烦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-5 22:51:53 | 显示全部楼层
第一个``i和j``是分清楚了的`??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-5 23:05:36 | 显示全部楼层
本帖最后由 jinglinggong 于 2012-9-5 23:21 编辑

还真搞错了,是15,24,8,8,  为什么不同编辑器得到的答案不一样、、、、这个真心纠结
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-6 10:50:05 | 显示全部楼层
第一个 我电脑上是  15  31 11  5
这个主要是 运算符结合性的问题,有的编译器是左结合,有的是右结合。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-6 10:53:50 | 显示全部楼层
对于这种结合性的问题,最好的方法就是多打几个小括号就是最保险的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-6 12:00:10 | 显示全部楼层
本帖最后由 wufadeshou 于 2012-9-6 12:01 编辑

这个确实是编译器的问题我最近在学习汇编看了小甲鱼的汇编教程,小甲鱼还专门说了你这道题目。。你这个问题确实是编译器优化的问题。,在VC++6.0反编译用汇编显示运行过程的话就会一目了然。。所以你也没必要为这个纠结。。如果想刨根究底的话建议看下小甲鱼的汇编教程的前三章即可!!    小甲鱼汇编系列教程下载地址  http://fishc.org/category/assembly 详细看下前三章即可。。其中有一个视频专门说了你这个问题!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-6 12:42:56 | 显示全部楼层
是小甲鱼的视频讲错了,这个我可以肯定的告诉你,每个人都有错误的时候,老师也不例外,来说一下这个题吧,赋值运算符的优先级高于逗号运算符的优先级,  所以把 x=a+b 运算出来就直接赋值给 y了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-7 02:19:40 | 显示全部楼层
第一个问题不用纠结,不同的环境会不一样,也没什么好研究的,这种题目的初衷是让你知道这种编程风格
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-7 07:40:12 | 显示全部楼层
第一个不用纠结,是VC6的代码优化产生的BUG,还有就是其实不用开虚拟机的说,WIN7 64 WIN7 32 XP下使用VC6都是一个效果。代码不会产生任何区别。
第二个么,你要知道逗号的优化级是低于赋值的,所以是先赋值,才去逗号之后的(b+c)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-13 13:10:58 | 显示全部楼层
我刚学到这。。。。第二个我碰到过呵呵 。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-13 17:48:10 | 显示全部楼层
一般来说:i++是先引用i的值,再把i加一;而++i是先增加后引用
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-15 00:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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