【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函数中与进制数有关的转换说明符,以下有或的要么是有细微差别要么是没有差别,百度一下就可以了。

转换说明符 进制 数的种类 是否有符号 记忆方法 %d 或者 %i 十进制 整数 有 d就是decimal %u 十进制 整数 无 u就是unsigned int %f 或者 %G 或者 %g 或者 %E 或者 %e 十进制 浮点数 有 f就是float %o 八进制 整数 否 o就是octal %x 或者 %X 十六进制 整数 否 十六进制表数是0x开头

2.3 整数常量的直接表示

注意:大小写均可

类型 十六进制例子 八进制例子 十进制例子 char ‘\x41’或者 0x41 (下面会说明为何) ‘\101’ 或者 0101 65 int 0x41 0101 65 unsigned int 0x41u 0101u 65u long 0x41L 0101L 65L unsigned long 0x41UL 0101UL 65UL long long 0x41LL 0101LL 65LL unsigned long long 0x41ULL 0101ULL 65ULL

2.4 浮点常量的直接表示

  浮点不一定必须有小数部分,只是可以存储小数部分。它更类似于科学计数法,有专门的区域存储指数和其他有效数字。而且在C语言中^符号是位操作符号,并不是次方的符号,因此表示10的N次方时请使用e计数法
  如果不需要,浮点常量可以 没有小数点(例如 2.0E5等价于2E5) 或者 没有指数部分(例如 19.28等价于19.28E0),或者没有整数(例如 0.28等价于 .28 别忘了 . )。
注意:空格只是让你看清楚,并不是说C语言中需要空格

数字 科学技术法 指数计数法 1 000 000 000 1.0*10的9次方 10e9 123 000 1.23*10的5次方 1.23e5 322.56 3.2256*10的平方 3.2556e2 0.000 056 5.6*10的-5次方 5.6e-5

另外还有一个特殊的浮点值 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类型,

例子:

类型 十进制例子 十六进制 float 3.14 .2 4e16 .8E-5 100. 0xa.1fp10 (0x+十六进制+p+2的指数) Double 4.1

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
保留版权,抄袭必究
希望您能在评论区指出宝贵意见,也欢迎关注我的微信号与我交流互动
我的微信公众号:xiaotangruanjian


更新进程

日期 日志 作者 2016年10月11日 创建文档 唐家勋
2 0
原创粉丝点击