鄙人C语言小白一枚,踩了很多坑,在此记录,愿能帮其他小白避避雷。
一.四舍五入
鄙人在做C语言练习题时,常常会在数据的”四舍五入“上出现问题。
1.需不需要四舍五入?
C语言取整常见两种情况:
1)整数除法运算时会自动取整
2)控制浮点型输出的小数点位数
那么问题来了,二者的进位情况是什么样的呢?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=5,b=3;
double c=5.0,d=3.0;
printf ("%d\n",a/b);
printf ("%f\n",c/d);
printf ("%.0f\n",c/d);
printf ("%.2f\n",c/d);
return 0;
}
我们不难看出
1)整型相除时会直接舍弃掉小数部分。
2)而浮点数进行除法运算时,会根据保留的位数进行四舍五入。
2.其他的四舍五入的办法?
比如我现在通过计算得到了一个浮点型数据,但我并不想直接输出,而是需要让它四舍五入后参与后续运算,该怎么做呢?
网上有很多方法,但作为小白我还是推荐这个方法:
(int)(num+0.5)
由于类型转换时会自动舍弃小数部分,所以可以直接加上0.5后进行判断。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=5,b=3,c=2;
printf("%d\n",(int)(a/b+0.5));
printf("%d\n",(int)(a/c+0.5));
}
运行结果如下:
这样就实现了对浮点数的四舍五入。
二.整型与浮点型的加减与大小比较
对于不少人来说,这貌似是常识性问题,但我相信在这里犯迷糊的人肯定不止我一个。
1.整型和浮点型可以直接加减吗?
答案是:可以。
#include <stdio.h>
#include <stdlib.h>
int main()
{
double a=5.5;
int b=3;
printf("%d\n",a+b);
printf("%f\n",a+b);
}
输出结果如下:
这里就涉及到自动类型转换的问题。
1)有浮点型参与运算得到的结果一定是浮点型;
2)占位符不可以进行类型转换;
3)低优先级会被高优先级同化。
数据优先级:double>float>int>char
接下来以这三个标准来进行分析上述代码。
Ⅰ.因为有浮点型参与了运算(无论加减乘除),所以结果被自动转换成了浮点型
Ⅱ.由于占位符无法进行数据类型转换,数据类型不同,输出异常。
Ⅲ.而"%lf"对应浮点型,可以正常输出。
2.整型和浮点型可以比较大小吗?
答案仍然是:可以。
可以简单理解在比较大小时整型被扩展成了浮点型。但注意尽量不要这样比较,因为浮点型会存在精度误差,即计算机无法准确存储浮点型。
三.取出数字中的各位数
这是个没什么用的小。。。技巧?
“%10”可以理解为取出最后一位数
“/10”可以理解为去除最后一位数
例如
1234%10 就是拿出4;
1234/10就是去掉4,剩下的数就是123.
这只是因为我前期老是不懂取余以及除法操作才想出来的笨法。。。
饭后闲话
实话实说,C语言入门我真的感觉不容易,我是大学之前完全没接触过C语言,身边很多C语言大佬都表示C语言怎么怎么简单好学,可能确实是因为我太菜了吧(悲)。学校的课程进度飞快,很多细节根本不讲,所以我真的就是在一点点做题去摸索,犯了无数低级的错误,但我还是一直坚持着,并且默默的记录着自己犯错误的那些小点,希望能帮帮那些和我一样从入门就感觉困难的萌新吧~愿我们一起努力,干掉C语言!