C语言参悟-运算符表达式和语句
一、概述
在我刚开始学C语言的时候,语句和运算符号这些对我来说还是很陌生的。
现在来看我对于这个的理解其实就是一种 处理数据语法的规范,因为计算机处理数据和我们人来处理数据是有不一样的。计算机面对我们现实生活,计算机其实是做了抽象,编程语言就是对处理真实世界的方法提供的一种处理工具,里面的运算符和表达式语句这些都是用编程语言来描述真实世界罢了。
运算符、表达式、语句也是处理数据的语法规范。也就是说编程语言能够处理这种符合规范的语句,在这个语法之外的情况是不能被处理的。就像英语一样,总是按照一定的规则,主谓宾之类的的规则。
- 语法规范
把 我们人 类别于 计算机
我们就能明白:一天的时间是24小时。 这个语句的意思
但是我们可能不太明白:24一天是的时间 的语句意思,但即是认识语句,但是很可能误解我们的意图。
计算机也是只能接收合法的规则信息,也就是编程语言编写的有效语句。
- 处理数据
编程语言的诞生就是为了方便人类来解决生活的问题。存在的意义就是解放人类,创造价值。解决问题就是需要处理问题,把问题以一定的形式输入到计算机里面成为计算机数据,再用编程语言编写出软件来处理数据,就达到了处理数据的目的啦。
二、运算符
运算符其实就是 C语言对数据进行一种处理的符号,我们可以用这些符号来解决真实世界中的任务。
运算符号和变量常量等等构成的一些式子,也叫运算符表达式和语句,这些就是处理数据的功能,完全是计算的功能。
0. 运算符分类
运算符 总是和参与运算的 运算单元 在一起的。运算符不能单独存在的哈,单独存在就失去其意义啦
就像下面的 j = i + j;
int i = 0, j = 0;
j = i + j;
j = (i + j) * j - j;
解释就像下面
i | + | j |
---|---|---|
运算单元 | 运算符 | 运算单元 |
( | i | + | j | ) | * | j | - | j |
---|---|---|---|---|---|---|---|---|
运算符 | 运算单元 | 运算符 | 运算单元 | 运算符 | 运算符 | 运算单元 | 运算符 | 运算单元 |
这里面就会引出两个问题:
- 一、1个运算符能够和几个 运算单元 组合
- 二、运算符 之间 共用 运算单元 的时候 是谁先算呢?
- 三、计算的顺序呢?-》这个一般就是从左到右计算的,
第一个问题其实就是在C语言里面会有这种概念叫 多目运算符 就三种
- 单目运算符:++;- - 就是一个运算符 与 一个运算单元组合 -》 1 对 1
就像 i++, i- - - 双目运算符:+ ;-;*;/;% 就是一个运算符 要和 两个运算单元组合 -》1 对 2
- 三目运算符:? : 就是一个运算符 要和 三个运算单元组合 -》1 对 3
第二个问题 C语言也有解决的概念叫 运算符优先级
下面的表格其实就是 对 C语言里面所有的运算符的介绍。
1. 数学运算符
数学符号就是和 我们认知里面的数学是一致的。
- +:加号
- -:减号
- *:乘号
- /:除号
- %:取余号
- =:赋值号:就是把右边的值赋给昨天的值
这个比较特殊,可以放在语句后面
int i = 0;
int j = 1;
j = j+i;
j = j-1;
2. 逻辑运算符
这个就是普通的条件逻辑判断的。
-
||:或:两个条件满足一个即可
-
&&:且
-
==:相等
-
!:取反
-
>:大于
-
>=:大于等于
-
<:小于
-
<=:小于等于
-
!=:不等于
3. 二进制运算符
C语言的强大也在于对二进制的支持。像很多时候,数据本身是以二进制的方式存储着,但是我们可以通过二进制的方式去处理数据。
- <<、 >> 移位运算符
对于左移、右移,体现在二进制的位数-总是在 2 的倍数扩大或缩小,左右移都会溢出位数,就是都会变成0的。这个要小心点。
//0000 1000
int i = 8;
//左移一位
i = i << 1; // i == 0001 0000 变成 16了
//右移一位
i = i >> 1; // i == 0000 0100 变成 4了
- 二进制与或非异或
int i = 1; // 0000 0001
int j = 2; // 0000 0010
int k = 4; // 0000 0100
int m;
//或运算 就是为了取并集
m = i | j; // 0000 0011
m = i | k; // 0000 0101
//与运算 就是为了取交集
m = 1 & 3; // 0000 0001 & 0000 0011 == 0000 0001
m = 5 & 3; // 0000 0111 & 0000 0011 == 0000 0011
//非运算 就是为了 0 和 1交替
m = ~3; // ~0000 0011 == 1111 1100
m = ~4; // ~0000 0100 == 1111 1011
//异或预算 就是为了 或的逆运算
m = 1 ^ 3; // 0000 0001 ^ 0000 0011 == 0000 0010
m = 5 ^ 3; // 0000 0111 & 0000 0011 == 0000 0100
这个不太懂的话,可以看看二进制的运算规则,C语言也是提供了这样的一个语法功能。
这个在底层代码即是直接设置 16进制的值比较多,就像51单片机点灯的时候,把一个16位的数映射到8个IO口一样。
但是在 上层应用开发的时候,常常会用二进制的运算当成参数和功能的累计。
就像下面的一个API函数一样,Qt::WindowFlags 可以用二进制的方式进行参数累计
setWindowFlags(Qt::WindowFlags type)
我们就可以用 | 运算符去并集参数。就是兼济多个参数的功能,我们解析这些参数的时候用 ^ 就可以逆运算回去。
setWindowFlags(Qt::Dialog | Qt::Widget)
WindowFlags 参数名 | 功能 |
---|---|
Qt::Widget | 0x00000000 |
Qt::Window | 0x00000001 |
Qt::Dialog | 0x00000002 | Window |
Qt::Sheet | 0x00000004 | Window |
Qt::Drawer | Sheet | Dialog |
Qt::Popup | 0x00000008 | Window |
Qt::Tool | Popup | Dialog |
- >>:右移
- <<:左移
- &:与
- |:或
- ~:非
- ^:异或
4. 便捷组合运算符
这个其实就是非常的一个便捷运算:
下面两个语句是等效的。下面其实就是对上面的 数学运算符 和 二进制运算符 常用功能的简写。
i = i + 1;
i += 1;
- +=:
- *=
- /=
- %=
- ^=
- &=
- |=
- >>=
- <<=
5. ++ – 运算符
其实就是 i++ 和 i - - 这种功能。