C语言学习笔记
dmr曾说过:C诡异离奇,缺陷重重,并获得如此大的成功。
一、C语言中的数据类型 1.1常量和变量 常量就是程序中不可改变其值的量,一般分为整形常量(短整型和长整形,无符号和有符号)、实型常量(单精度和双精度)、字符型常量、字符串常量。
c语言中的整形常量一般以十进制表示,但有的时候也可以用二进制、八进制、十六进制来表示。
变量不同于常量,变量在内存中是可以改变其值的,在定义变量的时候要提前声明变量的类型和变量名,定义变量的一般形式是:类型关键字 变量名;
例如一个简单的小程序:
#include (stdio.h)
int main()
(
int a;
float b;
char c;
a = 1;
b = 2.5;
c = 'A' ;
return 0;
)
任何一个C语言程序都必须有一个主函数的入口,这个主函数就是main()函数 变量名是用户定义的标识符,用于标识内存中的一个具体的存储单元,在这个存储单元中可以放入任何的值,简单来说一个变量就相当于给常量起了一个名字,或者把这个变量理解为一个放物品的盒子,变量就是给这个盒子起的名字,而盒子里面可以放你想放入的任何东西。
另外在对于变量名命名的时候应该遵循标识符命名规则:
(1)标识符只能由英文字母、数字和下划线组成
(2)标识符必须以字母下划线开头
(3)不允许使用C关键字为标识符命名
(4)标识符可以包含任意多个字符,但一般会有更大长度的限制,与编译器相关,不过大多情况先不会达到限制
注意:标识符是区分大小写的 另外C语言中的注释是使用//(单行注释)和 /* */(多行注释)来完成的 注释之间不能嵌套,即一个注释中不能加入另一个注释 多个变量之间使用逗号作为分隔符 赋值运算符=,用于变量赋值,将右边的表达式的值赋值给左边的变量(左边只能是变量,不能是常量或者表达式)
sizeof()是用来计算数据类型或表达式所占用的能存字节数(sizeof是关键字,不是函数名)
2.简单的算术运算和算术表达式
2.1.算符运算符和表达式 C语言中的算符运算符就相当于我们小时候学习数学中的加减乘除,算符运算符又分为三种,一元运算符、二元运算符、三元运算符 其中一元、二元、和三元运算符的区别在于需要几个操作数
一元运算符(-) 取相反数
二元运算符(* / % + -)乘,除,取余,加,减
其中需要注意的是各运算符之间的优先级别
在C语言中有一个和数学中的不同之处在于 eg: 1/2和1.0/2 这两个的性质,前者是整数除法,后者是浮点数除法
注意:C语言中求余运算仅仅限定在两个数都是整数的情况下,不能对两个实数型数据进行求余运算 2.2增1和减1运算符
在这个知识点里面值得注意的是先加加和后加加的问题
如:int i=3; 之后分别执行这两条语句
m=i++;
m=++i;
对于语句一,m=i++的意义在于先执行m=i 的赋值表达式,之后再执行增值的 i++表达式
对于语句二,m=++i的意义在于先执行++i 的增值表达式,之后再执行m = i 的赋值表达式
同样,i - - 和 - - i 也是如此
总结:对于此类问题可以采用就近原则,对于增1和减1的操作,后置自增自减,先取变量本身的值,再进行自增和自减的操作;前置自增自减,先进行自增自减,再取变换后的值
2.3宏常量和宏替换 &意为取地址符号 #define PI 3.14159 即为定义了一个宏常量,注意不需加上等号,而且不以分号结尾
宏常量的问题:宏常量没有数据类型,编译器对宏常量不进行类型检测,只进行简单的字符串的替换,这种替换过程中容易产生错误
所以需要引入const常量
const 常量弥补了宏常量的一个缺陷,
如: const double PI = 3.14159; //定义类型的const常量PI
自动类型转换和强制类型转换
一般我们可以把每一个数据类型的阶段比做成不同大小的杯子 当我有一个可以放1L水的杯子,另外还有一个可以放5L水的杯子,我们可以把1L杯子里面的水倒入到5L的杯子里面,那么这个过程就相当于是一个自动转换的过程。
那么,我们现在来看C语言里的数据类型自动转换 char ,short---int---unsigned---long---unsigned---float---double---long double 从左往右就相当于从小杯子往大杯子里面倒水的一个过程,不会产生溢出现象,因此对数据来说是安全的 另外其实还有一种转换方式叫做强制类型转换 强制类型转换就相当于可以装5L水的杯子里面放了1L的水,之后我把这个1L的水全部倒入到一个1L的杯子里面,这样就实现了强制类型转换,可是,对于强制类型来说一般是危险的,如果大杯子里面的水小杯子放不下,那么就会产生一种数据的溢出,就像水会撒出来一样,数据就会丢失。