C语言的基本数据类型如下图所示:
int与char统称为整型,都可以用于表示整数,区别是char只占1字节,而int一般占4字节(注意!C语言标准只规定了char占用一个字节,而未规定int占几字节,具体的字节数由编译器与机器架构实现,在32位的机器上,int一般占4字节)。
char除了可以表示1字节的整数外,还可以表示字符,C语言中,字符用单引号表示,如’a’,‘#’。字符的实际存储形式是字符对应的ASCII值,如’a’的ASCII值是97,那么,在程序中,所有出现’a’的地方都可以用数值97代替。
在int与char类型的前面可以加上signed或unsigned限定数据的符号,表示数据的正负。signed与unsigned的区别在于数据的最高位,signed数据的最高位用0表示数据为正,用1表示数据为负,剩下的位数用于表示数据的数值大小,而unsigned数据则全部位都用于表示数值大小。所以,相同类型的数据,unsigned比signed所表示的数据范围要大。以char型数据为例,signed char表示的范围为 -128-127,unsigned char表示的范围为0-255。
short与long可以用于修饰int,用于获取不同长度的整型。在32位的Ubuntu14.04系统中,int一般占用4字节,而short占用2字节,long占用4字节,long long占用8字节。(注意!C语言同样未规定short与long的具体长度,C语言只规定了,short的长度不能大于int,long的长度不能小于int,具体的长度还是由编译器与机器架构实现。)
signed/unsigned可以和short/long一起使用,比如unsigned short表示无符号短整型。
float与double统称实型,它们都可以用于表示浮点数。浮点数都是有符号数,不可以用限定符进行限定,像unsigned short float这样的写法是错误的。在32位的Ubuntu14.04系统中,float一般占用4字节,double一般占用8字节。长度不一样导致两者所能表示的数据范围和精度不一样,float型数据能得到6位有效数字,而double型数据能得到15位有效数字。此外,long可与double构成long double类型,表示高精度浮点型,经验证,long double类型的长度可以达到16字节!
标准C语言提供两个用于标准输入输出的函数printf和scanf。printf可以向标准输出(一般是屏幕)按指定格式输出内容。scanf可以从标准输入(一般是键盘)按指定格式接收数据。
函数原型:
int printf(格式化控制字符串,输出参数1,输出参数2,…);
返回值:
成功返回打印的字符个数,失败返回一个负数
举例:
printf(“%d add %d is %d\n”, 3, 1, 4);
输出:
3 add 1 is 4
可以通过不同的格式控制字符来控制数据的输出格式,采用不同的格式控制字符,即使相同的数据,也可以有不同的输出形式,具体的格式控制格式如下:
可以在格式化控制字符中限定字符的输出长度与对齐方式,以%X.Y□举例(□表示对应的格式化控制字符),X用于限定输出的长度,在该长度以内,默认按照右对齐,可以前面加上“-”表示左对齐,超出该长度时,该参数无效。Y用于限定浮点数的打印精度,默认是小数点后6位。举例说明:
printf("%6d\n",123); //输出长度6位,右对齐
printf("%6d\n",1234);
printf("%6d\n",12345);
printf("%6d\n",123456);
输出:
printf("%-6d\n",123); //输出长度为6位,左对齐
printf("%-6d\n",1234);
printf("%-6d\n",12345);
printf("%-6d\n",123456);
输出:
printf("%f\n",3.1415926); //默认格式输出,小数点后6位
printf("%.3f\n",3.1415926); //小数点后保留3位
printf("%.4f\n",3.1415926); //小数点后保留4位
printf("%.5f\n",3.1415926); //小数点后保留5位
printf("%6.2f\n",3.1415); //小数点后保留两位,宽度为6字节,右对齐
printf("%7.2f\n",3.1415); //小数点后保留两位,宽度为7字节,右对齐
输出:
对于使用unsigned或long修饰的类型,打印时还需要加上对应的限定符描述,否则打印的结果也是不对的,规则列表如下 :
函数原型:
int scanf(格式控制字符串,输入参数1,输入参数2,…);
返回值:
成功返回读取的参数个数,失败返回EOF
举例:
scanf(“%d %c”, &a, &c);
关于使用scanf有以下注意点:
运算符是可以对数据进行运算的符号,比如sizeof以及+ - * / %等符号。
运算符操作的对象称为操作数,运算符与操作数组合成表达式。表达式结尾没有分号,如果在表达式两边加上一个括号,那么表达式最终可以得到一个值,这是表达式与语句的区别。
使用运算符与表达式的时候,以下几点要注意:
C语言中的运算符定义很宽,除数值运算符外,取地址,解地址,赋值(=)等都可以看成运算符,以下是C语言中运算符的总结:
表格来自《C语言深度解剖(第2版)》
注:同一优先级的运算符,运算次序由结合方向所决定。解决优先级与运算方向困惑的最好办法是使用括号,推荐多使用括号。
赋值 < 逻辑 < 相等 < 关系 < 算术运算 < 一元运算
包括:
注意点:
包括:
注意点:
注意点:
C语言中,逗号也是运算符的一种,类似下面这样的表达式是允许的:
(3, 4)
(a > 0, a = 1)
(printf(“hello”), 1, 3)
逗号运算是C语言中优先级最低的运算符,所有表达式从左往右依次计算,逗号运算的结果是最后一个表达式的值。
表达式1?表达2:表达3
a > b? a: b
使用if语句的注意事项:
switch(表达式1) { case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; ...... case 常量表达式n: 语句n; break; default: 语句n+1; break; } |
使用switch语句的注意事项:
理论上,使用switch的语句都可以用if语句来改写,但是,在纯粹进行数字或字符比较且比较的分支较多时,使用switch语句的代码逻辑性和可读性都要优于if语句,自行体会。
除了用程序直接来表现程序流程之外,我们还可以用流程图的形式来表现程序的流程,常用的流程表示有以下这么几种。
使用流程图表示求一个数的绝对值的过程:
使用流程表图表示求1+2+3+…+100: