c语言高手请进,关于浮点型变量储存EOF字符的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言高手请进,关于浮点型变量储存EOF字符的问题相关的知识,希望对你有一定的参考价值。

案例我只敲了片段,定义什么的都没问题。
案例一:
while (scanf("%lf", &a) != EOF)


printf("%lf\n", a);


该程序可以正常终止,当我键入^z(为同时按下Ctrl键和字母键z,即为终止标志,其值为EOF)的时候,就终止循环了。
案例二:
do

scanf("%lf", &a);
printf("%lf\n", a);
while (a != EOF);
该程序却无法正常终止循环,我按了无数次^z(Ctrl+z)都无法终止。

按理说两个程序功效是相同的,但为什么案例一可以执行,而案例二却不行呢?
案例三:

char a;
do

a = getchar();
printf("%c", a);
while (a != EOF);
可以正常终止。

案例四:
char a;
do

scanf("%c", &a);
printf("%c", a);
while (a != EOF);
不能正常终止。
为什么啊??

第一个案例是以scanf的返回值做为参数与EOF进行比较,scanf如果遇到错误或遇到end of file
,返回值为EOF。你的Ctrl+z就是结束的意思

第二个案例,你读取的是一个double类型的数据,让这个数据与EOF比较,你将Ctrl+z赋值
给一个double类型的数,显然是不现实的。要想结束,你可以输入-1。追问

厉害,,太厉害了,我刚刚补充了后续的问题,能帮忙解释一下吗?

追答

这其实是个很复杂的问题,我也知道有这么回事,但我没法解释清楚这个现象。
也许可以这么理解(但肯定是有问题的):
a=getchar();是返回值赋给了c,getchar()的返回值能够对ctrl+z做出反应,并且返回一个
与EOF同值的数
而scanf("%c", &a);中,scanf的返回值显然能够识别ctrl+z,但是单独的a却不能分辨,我
跟到代码里的时候,发现赋给a的值是一个很奇怪的'?'号
scanf涉及到很复杂的过程,我说不清楚

参考技术A 3. getchar从输入流中读一个字符,EOF也是一个字符,a能够得到正确赋值,所以能够终止
4.scanf不会读取EOF到a中,因为scanf碰到EOF就已经返回了,a其实没有被赋值,所以循环不会停止
参考技术B 不一样的,scanf(("%lf", &a)!=EOF的意思是scanf(("%lf", &a)的返回值不等EOF;哥们,scanf是有返回值的。而第二段里面你是拿a来和eof做比较,当然不一样,因为比较的不是同一个东西= =!追问

顿时涨姿势了。。我刚刚补充了后续的问题,能帮忙解释一下吗?

追答

getchar()和scanf当然也是不同的,scanf不能用于读取空格啦,制表符,回车啦之类的空白字符,而getchar()则可以读取上述的字符。

c语言中将一个浮点型赋值给整型时,会不会四舍五入?

c语言中将一个浮点型赋值给整型时,不会四舍五入,会直接舍去小数部分的数据,也可以认为是执行了下取整运算。

将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分, 只保留整数部分。将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。

例如执行赋值后,无论5.4还是5.6都会变成5。

扩展资料:

C语言中其它数据类型的转换:

1、单、双精度浮点型

由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为double型数据参加运算,然后直接赋值。double型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。

2、char型与int型

int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。

char型数值赋给int型变量时, 一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,就作为负数处理。

3、int型与long型

long型数据赋给int型变量时,将低16位值送给int型变量,而将高16 位截断舍弃。(这里假定int型占两个字节)。 将int型数据送给long型变量时,其外部值保持不变,而内部形式有所改变。

参考资料来源:百度百科-C语言类型强制转换

参考技术A

c语言中将一个浮点型赋值给整型时,不会四舍五入,会直接舍去小数部分的数据,也可以认为是执行了下取整运算。

将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分, 只保留整数部分。将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。

例如执行赋值后,无论5.4还是5.6都会变成5。

扩展资料:

C语言中其它数据类型的转换:

1、单、双精度浮点型

由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为double型数据参加运算,然后直接赋值。double型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。

2、char型与int型

int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。

char型数值赋给int型变量时, 一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,就作为负数处理。

3、int型与long型

long型数据赋给int型变量时,将低16位值送给int型变量,而将高16 位截断舍弃。(这里假定int型占两个字节)。 将int型数据送给long型变量时,其外部值保持不变,而内部形式有所改变。

参考资料来源:百度百科-C语言类型强制转换

参考技术B 不会的,不过可以写一个函数自己转换啊
#include<stdio.h>
int fun(float x)
int a=(int)x;

if(a+0.5 > x)
return a;
else
return a+1;

int main()
printf("%d\n",fun(3.49));
printf("%d\n",fun(3.5));

return 0;
打印的为3和4,C语言很灵活的,楼主想要什么几乎都能实现本回答被提问者采纳
参考技术C

不会的,看程序的运行结果:

参考技术D 你好,不会的。浮点型数据赋给整型时,浮点型就会被自动转换成整型,整型只是整数部分。
希望能够帮到你。

以上是关于c语言高手请进,关于浮点型变量储存EOF字符的问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言高手请进

高手请进!如何把整形数据转换为字符串(C语言)?

高手请进,关于string类。

编程高手请进~~~~

单片机C语言中如何将浮点型变量转换成字符串输出

C语言 ASCII码的问题 高手请进~