【C语言学习笔记】一、数据类型那些事儿
来源:互联网 发布:通达信趋势浪指标源码 编辑:程序博客网 时间:2024/06/06 07:10
系列前言:笔者最近刚刚踏入C语言的大门,将在“C语言学习笔记”系列中记录笔者的学习历程。本系列的文章不会面面俱到,主要挑一些作者认为重要的地方记录下来。希望能借本系列文章巩固知识,并与各位同学共同交流进步。若有不当,请君指正,感谢您的关注。
数据类型那些事儿
1. “声明”与“定义”的区分
1.1 声明
声明指定了一个变量的标识符,用来描述变量的类型,是类型还是对象,或者函数等,用于让编译器识别变量名所引用的实体,并没有实际分配内存。
以下是一些例子
extern int bar;extern int g(int, int);//函数的声明可以省略变量名,也可以加上double f(int, double); //对于函数声明,extern关键字是可以省略的。
1.2 定义
定义是对声明的实现或者实例化。连接器(linker)需要定义来引用内存实体。
以下是一些例子
int bar;int g(int lhs, int rhs) {return lhs*rhs;} double f(int i, double d) {return i+d;}
1.3 何时分配内存?
C语言在声明变量的时候即已为变量分配内存。这点等作者再往深入学习下去之后再补充解释。
//何时分配内存?int i;//虽然上一行代码可能赋予初始值,但是仍然分配了内存。
PS:extern关键字可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。
1.4 知识迁移:JAVA与C在声明与定义方面的区别
若无基础,这部分可以跳过
在JAVA中变量的声明与C意义不同。在Java中基本数据类型的变量作为类成员变量的时候会被自动初始化,而作为方法内的局部变量使用之前必须进行初始化(不使用也可以通过,但是这样不就和没写一样吗),否则无法通过编译,这点和C相同。
对于Java中变量的声明可以分开来看。
a)对于引用类型变量,声明是指在JAVA虚拟机栈内存创建引用对象(这不就是告知了虚拟机指向变量的类型,却没有告诉内容吗?)。而定义可以理解为将引用指向堆内存某对象。
b)对于普通类型变量,和C规则相同(因为基本类型变量是直接存储在栈内存中,其他很多地方也与C基本一致。
在JAVA中,一般的成员函数也不需要main方法前进行声明。JAVA中函数的声明应该是指在接口或者抽象类中那些抽象方法。对于native方法也可看作声明(真正的定义应该是在c代码中)。
另外,还有一点,就算是C语言非基本类型,其分配内存都是在声明时分配的。而Java则是在new关键字的地方才分配内存。(其实在声明的时候系统会在栈内存给引用分配内存,但是一般来说引用占据的内存不考虑)
public class Test{ private int A;//在作为类成员变量时是定义,因为会被默认初始化,分配栈内存 private Integer B;//在作为类成员变量时是声明,因为不指向任何堆内存的对象。为Null值 public static void main(String[] args){ int C;//虽然不会被初始化,但这种写法也不合法,必须显式初始化 Integer D;//同上,也可被看作是声明 } public native void methodA();//声明,没有给出函数体 public interface TestInterface{ void methodA();//声明,没有给出函数体 } public abstract class TestAbstractClass{ abstract void methodA();//声明,没有给出函数体 }}
2. 表数方式
2.1 进制数的直接表示
C语言中主要支持二进制、十六进制、八进制
int var=0; //不要和swift混淆,C语言中var不是关键字,这里是变量名var=0b1010101110; //二进制 (记忆方法,b是binary的缩写)var=0x1A2B3C; //十六进制 (记忆方法,0x开头)var=01234567; //八进制 (记忆方法,0开头的数字(0b,0x不算))
特别注意:这些都是表数方式而已,最终存储在变量中的都是二进制,你也可以很轻松的在printf中将他们用各种进制输出。
2.2 进制数的输出
以下罗列printf和scanf函数中与进制数有关的转换说明符,以下有或的要么是有细微差别要么是没有差别,百度一下就可以了。
2.3 整数常量的直接表示
注意:大小写均可
2.4 浮点常量的直接表示
浮点不一定必须有小数部分,只是可以存储小数部分。它更类似于科学计数法,有专门的区域存储指数和其他有效数字。而且在C语言中^符号是位操作符号,并不是次方的符号,因此表示10的N次方时请使用e计数法。
如果不需要,浮点常量可以 没有小数点(例如 2.0E5等价于2E5) 或者 没有指数部分(例如 19.28等价于19.28E0),或者没有整数(例如 0.28等价于 .28 别忘了 . )。
注意:空格只是让你看清楚,并不是说C语言中需要空格
另外还有一个特殊的浮点值 NaN( Not a Number)表示不可表示的数。当然也有
3. 类型
3.1 数字“常量”的类型(在没有用2.3提到的方式指定时)
a) 整数根据值的大小有小到大依次识别为 int->long int->unsigned long ->long long -> unsigned longlong
b)八进制或十六进制通常被视为int,若值过大,编译器会试用unsighed int。如果不够大依次视为 long -> unsigned long -> long long -> unsigned long long
c)默认情况下,编译器将浮点常量当作double类型,
例子:
4. 误区和陷阱
4.1 浮点数是丢弃而不是四舍五入
当浮点数精度无法表示数字时,C语言会直接丢弃放不下的部分,而不是四舍五入。
4.2 过大整数是越界时会发生“轮回”
当整数超过(最大值/最小值)时会跳转到(最小值/最大值)重新开始。
4.3 计算最大最小值时的错误
一个是需要注意不要忘记-1,另外一个如果非unsigned不要忘记符号位
4.4 整数与整数运算一定还是整数
1*2是整数不用说,有同学问笔者如下问题:
int a=5;int b=6;float f=a/b; //输出结果是0.000000而不是0.8333333
这是因为整数除以整数还是整数,发生了小数丢失(结尾)。
4.5 printf和scanf
可能有同学会奇怪f是什么意思。有同学认为应该是file的意思。但笔者不赞同。虽然后面将要接触到IO中的fgets() fputs()是file的意思不假。
但细看printf的使用方式:
printf("%d,%d,%d",1,1,1);//输出1,1,1printf("小%d唐%d真%d帅",1,1,1);//输出小1唐1真1帅
再看看scanf的使用方式:
scanf("%d,%d,%d",&a,&b,&c);//则必须输入:数字+,+数字+,+数字 这里注意,前面用的是英文逗号,所以输入也要为英文逗号("小%d唐%d真%d帅",1,1,1);//则必须输入:小+数字+唐+数字+真+数字+帅
就可以很容易得出结论,f一定是format(格式化的意思)。即输出格式化、输入格式化。它们做的就是将杂乱无章的输入输出进行格式化。
5. 预告
下一篇文章将会对这两个函数进行深入探讨,包括如何处理错误输入,出现错误之后会出现什么情况等等,欢迎继续关注。
关注作者
作者:唐家勋
邮箱:mrsteventang@gmail.com
QQ:649196486
保留版权,抄袭必究
希望您能在评论区指出宝贵意见,也欢迎关注我的微信号与我交流互动
更新进程
- 【C语言学习笔记】一、数据类型那些事儿
- C语言那些事儿(一)
- C语言全局变量那些事儿笔记
- 【开始学习C语言】计算机语言那些事儿
- C语言全局变量那些事儿
- C语言全局变量那些事儿
- C语言全局变量那些事儿
- C语言全局变量那些事儿
- C语言全局变量那些事儿
- C语言全局变量那些事儿
- C语言全局变量那些事儿
- C语言字符串那些事儿
- C语言输入输出那些事儿
- C语言学习笔记 数据类型
- 学习笔记---C语言数据类型
- C语言笔记之数据类型(一)
- 《从零开始学Swift》学习笔记(Day 11)——数据类型那些事儿?
- 《从零开始学Swift》学习笔记(Day 11)——数据类型那些事儿?
- 图片异步加载工具类
- 使用Mysql和NoSQL实现热词统计功能
- Nginx实战(五) 反向代理
- 【iOS】让我们一次性解决导航栏的所有问题
- android系统源码目录system/framework下各个jar包的用途以及部分jar包编译源码的位置
- 【C语言学习笔记】一、数据类型那些事儿
- Unity 实时显示FPS——移动端测试神器
- 已知圆弧上两点坐标及圆半径,计算圆心坐标
- RNN_LSTM公式
- 预处理-分节6(#pragma 为什么会有内存对齐)
- SQL语言-select查询操作
- web前端-CSS 图像透明/不透明 -027
- yii2使用缓存
- gulp入门-压缩js/css文件(windows)