鱼C论坛

 找回密码
 立即注册
查看: 8326|回复: 22

C的新手问题

[复制链接]
发表于 2013-8-30 09:04:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 懒家大少 于 2013-8-30 10:21 编辑
  1. #include <stdio.h>

  2. void main(){
  3.         printf("NO.1 = %f\n", 1.0 / 3 * 3);
  4.         printf("NO.2 = %f\n", 3 / 2);
  5.         printf("NO.3 = %f\n", 1 / 3 * 3);        

  6.         float a,b,c;
  7.         a = 1.0 / 3 * 3;
  8.         b = 3 / 2;
  9.         c = 1 / 3 * 3;
  10.         printf("NO.4 = %f\n", a);
  11.         printf("NO.5 = %f\n", b);
  12.         printf("NO.6 = %f\n", c);
  13. }
复制代码
一,以上,这个会报错!说我float缺少结束符号。

  1. #include <stdio.h>

  2. void main(){
  3.         float a,b,c;
  4.         a = 1.0 / 3 * 3;
  5.         b = 3 / 2;
  6.         c = 1 / 3 * 3;
  7.         printf("NO.4 = %f\n", a);
  8.         printf("NO.5 = %f\n", b);
  9.         printf("NO.6 = %f\n", c);

  10.         printf("NO.1 = %f\n", 1.0 / 3 * 3);
  11.         printf("NO.2 = %f\n", 3 / 2);
  12.         printf("NO.3 = %f\n", 1 / 3 * 3);        
  13. }
复制代码
二,以上这个不会报错,编译通过。

三,但是引发第三个问题,为什么
NO.5 != NO.2
这是为什么呢?


总结问题:
1,为什么一和二两个代码,一个能执行,第二个不能执行呢?
2,为什么会引发三,这个输出不一致的问题呢?
求高手解惑。
希望听到原理,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-30 09:05:05 | 显示全部楼层
自己顶沙发,坐等答案。
不知道做程序的,会不会早起来呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 09:19:41 | 显示全部楼层
你第一个犯了低级错误
声明变量必须在最开始
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 09:27:18 | 显示全部楼层
你犯了一个很低级错误
不在块首部声明变量
必须使用支持C99标准的编译器
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 09:28:00 | 显示全部楼层
程序没有问题的,你可以在VC环境下测试,OK

file:///C:/Users/Administrator/Desktop/BaiduShurufa_2013-8-30_9-26-43.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-30 09:47:55 | 显示全部楼层

好的。这个我明白了。跟JAVA不同,JAVA可以在用到的时候,在使用前声明。
也就是说C语言中,所有的变量都在块头声明咯?
那么,还有一个问题啊,那个两个答案为什么不一致呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-30 09:48:34 | 显示全部楼层
我是师兄 发表于 2013-8-30 09:27
你犯了一个很低级错误
不在块首部声明变量
必须使用支持C99标准的编译器

谢谢,我知道了。
C语言变量都要在块首声明?
不能在使用时声明?
那么,还有一个问题啊,那个两个答案为什么不一致呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-30 09:49:46 | 显示全部楼层
苹果沃珂 发表于 2013-8-30 09:28
程序没有问题的,你可以在VC环境下测试,OK

对不起,图片我看不到。
你想说的是两个问题中的哪一个呢?
能否COPY给我看呢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 10:04:58 | 显示全部楼层
结果是一样的,你是排列的顺序不一样。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 10:05:20 | 显示全部楼层
本帖最后由 苹果沃珂 于 2013-8-30 10:06 编辑
懒家大少 发表于 2013-8-30 09:49
对不起,图片我看不到。
你想说的是两个问题中的哪一个呢?
能否COPY给我看呢。

两个问题都没有错!代码直接复制你的帖子的。编译都ok!

VC 2008 环境, 结果如下:

                               
登录/注册后可看大图

BaiduShurufa_2013-8-30_9-26-43.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 10:07:19 | 显示全部楼层
苹果沃珂 发表于 2013-8-30 10:05
两个问题都没有错!代码直接复制你的帖子的。编译都ok!

VC 2008 环境, 结果如下:

百度输入法还带截图功能啊。。。
PS:你的头像我很喜欢。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-30 10:13:03 | 显示全部楼层
苹果沃珂 发表于 2013-8-30 10:05
两个问题都没有错!代码直接复制你的帖子的。编译都ok!

VC 2008 环境, 结果如下:

纳闷
这就是我要问的问题啊
为什么
NO.2 不等于 NO.5
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-30 10:13:50 | 显示全部楼层
liufei_vip 发表于 2013-8-30 10:04
结果是一样的,你是排列的顺序不一样。。。

你确定一样?求编译后结果。求编译器
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-30 10:14:43 | 显示全部楼层
苹果沃珂 发表于 2013-8-30 10:05
两个问题都没有错!代码直接复制你的帖子的。编译都ok!

VC 2008 环境, 结果如下:

第一个问题是有错的。C语言变量声明要在块头
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 10:22:32 | 显示全部楼层
liufei_vip 发表于 2013-8-30 10:07
百度输入法还带截图功能啊。。。
PS:你的头像我很喜欢。。。

谢谢你喜欢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 10:23:23 | 显示全部楼层
懒家大少 发表于 2013-8-30 10:13
你确定一样?求编译后结果。求编译器

哦,不好意思看差了。。。
2和5不一样的原因你看看浮点数的介绍。。。
printf("NO.2 = %f\n", 3 / 2);
这个语句,3/2等于1,1在计算机里用二进制表示是xxxx(具体我也不知道是多少,可能是补码表示的),然后这个xxxx用浮点数格式解释,就是打印的结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 10:28:07 | 显示全部楼层
懒家大少 发表于 2013-8-30 10:13
纳闷
这就是我要问的问题啊
为什么

printf("NO.2 = %f\n", 3 / 2);
   3/2是int与int的整数除法,结果也是int,而printf函数使用%lf是格式化float,来格式化一个int,是不对的。
float a,b,c;
b = 3 / 2;
printf("NO.5 = %f\n", b);
   3/2是int与int的整数除法,结果(为1)也是int,但经过b=3/2,实际已经发生类型转换了,所以b=1.
   printf函数使用%lf是格式化float,所以格式化输出b是没错的

评分

参与人数 1鱼币 +1 收起 理由
懒家大少 + 1 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-30 10:39:02 | 显示全部楼层
苹果沃珂 发表于 2013-8-30 10:28
printf("NO.2 = %f\n", 3 / 2);
   3/2是int与int的整数除法,结果也是int,而printf函数使用%lf是格式化 ...

也就是说,NO.2 = 0 是因为格式化错误,所以编译器丢个0出来
NO.5 = 1 之所以能输出1
是因为一开始计算的时候,得到的int 型 1,已隐式转换为float,所以在后面输出的时候,可以显示出来?

C语言有隐式转换吗?我以为只有显示转换呢,这么古老的语言。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 10:46:50 | 显示全部楼层
懒家大少 发表于 2013-8-30 10:39
也就是说,NO.2 = 0 是因为格式化错误,所以编译器丢个0出来
NO.5 = 1 之所以能输出1
是因为一开始计算 ...

你说的没错。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-30 15:27:09 | 显示全部楼层
懒家大少 发表于 2013-8-30 10:39
也就是说,NO.2 = 0 是因为格式化错误,所以编译器丢个0出来
NO.5 = 1 之所以能输出1
是因为一开始计算 ...

我jiao的你说的不对,不是因为格式化错误才丢个0出来。。。
而是像我说的那样才对。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-5 23:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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