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 的杯子里面, 这样就实现了强制类型转换, 可是, 对于强 制类型来说一般是危险的, 如果大杯子里面的水小杯子放不下, 那么就会产生一种数据的溢出, 就像水会撒出来一样, 数据就会丢失
来源: https://www.cnblogs.com/huolan520/p/8681319.html