c语言中的五类语句(statement):declaration:声明;assignment赋值;function:函数;control:控制;null:空
c程序结构:
#include <stdio> /*引用的链接库
function declaration; 函数声明
int main(void) 定义主函数返回值,int说明返回一个整数;以及参数,括号里的void说明main()函数不接受任何参数,main函数也能被其他函数调用。
{ 主函数体开始
int num ; 声明整数变量num,句末的分号表明这一行是C语言的一个语句或指令。声明多个类型相同的变量时,可以用逗号分隔他们,但函数参数变量的声明
必须在每个变量前面加上数据类型再用逗号分隔他们,而函数的局部变量需要在大括号中被声明,同时可以采用逗号分隔。
num=1 ; 为变量赋值
printf("i am a number %d.\n",num) ; 调用函数,符号\n表示换行。%d表示输出位置和形式(此位置以十进制输出)。%.2f.表示输出带两位小数的浮点数。%O/%X表示八/十六进制
return 0 ; 返回语句
} 主 函数体结束*/. /*和*/之间的语句都不会被执行,而//则只对当前行做注释
c中,所有的变量都必须在使用之前被声明,变量名字最长可以有63个字符,但外部标识符只能有31个字符。第一个字符必须是字母或下划线。但下划线打头的名字通常被认为是库和操作系统标识符。另外名字区分大小写。另外一个注意的问题是,不能使用关键字和保留标识符做变量名。注意,程序头的函数声明需要以分号结束,而程序体的函数定义则不需要以分号结束。
声明变量为变量分配内存,赋值则为内存赋值,赋值语句赋值的顺序从右到左。初始化变量就是为变量赋一个初始值。
call调用指函数向下调用比自己低的子程序;而invoke请求,则是指函数向上请求比自己高的子程序,如内核函数。
如何使程序具有良好的可读性:对变量进行注释;使用空行分割一个函数功能的不同部分。
程序状态(program state)指程序执行过程中的给定时间点上所有变量值的集合,是当前计算状态的一个快照。
几种数据类型:INT声明有符号整数类型;long/short/signed/unsigned用来声明字节长度和符号;char用来声明字符和小的整数(1Byte);float/double声明浮点数;_bool声明布尔变量(true/false);_complex/_Imaginary用来声明复数和虚数。确切长度类型(exact width type)uint32_t表示一个32位的无符号整数类型,_t表示type;最小长度类型(minimum width type)int_least8_t表示某个系统没有定义8位数据类型,但它的最小数据类型却是8位;最快最小长度类型(fastest minimum width type)int_fast8_t表示该系统中最小最快的数据类型;最大无符号整数类型uintmax_t。FILE *文件指针类型,用于对文件的读写操作。
浮点数3.16E7表示3.16乘以10的7次方,浮点数与整数在内存中的存储方式不同,浮点数采用小数部分+指数部分的存储方式,如3.16E将被存储为.316 8。因为在任意两个整数之间,哪怕差值为1的两个整数之间,也存在无穷的可能小数值,所以浮点数不能表示该区域内的所有值,而只能以近似值表示这两个整数,例如7.0可能以浮点值6.9999存储,至于几个9,涉及到精度问题。两个相差较大的浮点数进行减运算,会损失更多的精度。float类型数据至少能表示6位有效数字,取值范围在10的-37次方到37方,系统通常采用32位存储一个浮点数,前24位用于存储有效数字(尾数)和符号,后8位用于存储指数和符号.而double类型则和float类型的最小取值范围相同,只不过它的有效数字至少为10位(双精度),系统使用64位来存储double类型,多出的32位,要么全部用于尾数部分来增加精度,要么其中一部分被用于指数部分来增加取值范围,但每种方法都使
double类型至少表示13位有效数字,成为真正的双精度。还有一类特殊的浮点值NaN(not-a-number),例如asin()函数返回反正铉值,而正炫值不能大于1,即asin()函数的输入参数不能大于1,否则函数返回NaN值
_Bool布尔类型。习惯上为布尔变量取一个表明真或假值的名字。
整数溢出:有符号数和无符号数溢出时,都会返回到当前位数的最小值。有符号数溢出返回值跟位数有关,假设是8位,则返回-128d(d表示十进制),而16位,则返回-8192d;无符号溢出:因为最小值是0,所以任何位数都返回0。需要特别注意的是:溢出的时候,系统不会产生异常中断,给你提示,这样,程序中很可能存在漏洞,比如本来你希望使用的变量是一个大于0的无符号数,但它溢出时,就会出现错误。而你完全不知道程序已经脱离了你的控制期望。
浮点数溢出:与整数不同,包括上溢和下溢,上溢表示计算结果是一个大的不能用现有位数表示的数,这表示代表有效数字部分的位数,以及代表指数部分的位数都已经达到最大值,这时再大一点的数值,就会溢出,将返回一个无穷大的值,inf或infinity。下溢表示计算结果是一个小的不能用现有位数表示的数,这时所有位数应该都是二进制值1,这时你对它进行除以2操作,那么将右移一位,从而损失一位有效数字,如果你除以一个很大的值,也就是右移一定的位数将使所有的位都为0。
一个字符T,将被视为变量名;使用单引号‘T’,则被视为一个字符常量,即T的ASCII值;而使用双引号“T”,则被视为一个字符串,实际上这时时由‘T’和‘\0’(结束符)两个字符组成。
定义符号常量的格式:#define 常量的符号名 value;注意常量名(通常全大写)和常量值之间没有=号,这与赋值语句不同。另一种定义符号常量的方法:const int 常量符号名=value,这里使用const关键字将变量转换为常量
C的一些运算符:
间接运算符(indertection或dereference运算符):*注意与乘号的区别,乘号是水平分割X,而这里是垂直分割X。来取得指针变量指向内存中的值ptr=&bah;val=*ptr;这两句
语句相当于val=bah;可以看出,使用地址运算符和间接运算符可以完成上述语句的功能,这也只是间接运算符名字的由来。
&nb