文章目录
- 1 自增自减
- 2 关系运算符
- 3 逻辑运算符
- 4 条件运算符
- 5 逗号运算符
- 6 位运算符
1 自增自减
自增(++)自减(–)有两种形式,以自增为例
- ++i
先将i的值加1,然后用新的值参与运算。 - i++
i先用原值参与运算,然后再加1。
看上面的介绍,对于自增和自减很好理解,符号在前和符号在后也很好理解。但是当碰到printf时,事情就变得有趣起来。我们首先看一个例子
#include<stdio.h>int main()
{int i = 1;printf("%d,%d,%d",i,i++,++i);return 0;
}
输出结果为
3,2,3
下面来看一下为什么。printf是从右往左计算,从左往右输出。就是说函数printf从右到左压栈,然后将先读取到的放到栈底,最后读取到的放到栈顶,输出时候从栈顶开始
。
如此来看上面的计算过程,从右往左开始处理,先处理++i,++i是先计算后使用,也就是i先加1,变成2,但是暂时不使用。再往后处理i++,先使用,后计算。就是说先将i=2输出,然后再加1,此时i=3,这时计算完成,++i开始使用i的值,输出为3。最终i值为3,所以i的输出为3。printf输出的时候是从左往右,因此输出结果为3,2,3。
建议在程序设计时不要使用难以理解的表示方法,可以提高程序的可读性和可维护性。
2 关系运算符
常用的关系运算符有,等于(==),小于(<),大于(>),小于等于(<=),大于等于(>=),不等于(!=)。关系运算符的使用比较简单,这里就不再赘述了。
3 逻辑运算符
常用的逻辑运算符有,逻辑与(&&),逻辑或(||)和逻辑非(!)。逻辑运算符的使用也比较简单,这里也不再赘述了。
4 条件运算符
在介绍条件运算符之前,我们先看一小段简单的程序
#include<stdio.h>int main()
{int i = 1;int j = 10;int m = 0;if (i > j){m = i;}else{m = j;}printf("%d",m);return 0;
}
输出值为10,很简单。但是我们这么一大段程序,只为了把i和j中最大的值赋值给m,实在有些没必要。C语言中提供了条件运算符供我们使用。条件运算符的基本格式为
表达式1 ? 表达式2 : 表达式3;
它的意思是,如果表达式1为真,那么就取表达式2的值,否则取表达式3的值。这样的话可以用一句很简短的程序来实现上面的功能
m = (i > j) ? i : j;
5 逗号运算符
逗号运算符的基本形式是
(表达式1 , 表达式2 , 表达式3 , …… , 表达式n);
逗号运算符比较简单,它常用于有多个表达式,但是只需要一个表达式的情况。上面的输出值为表达式n的值。
在使用逗号运算符时需要注意,逗号运算符的优先级是最低的
。可以看一个例子
#include<stdio.h>int main()
{int i = 1;int j = 10;int m = 0;m = (i + j , j - i);printf("%d",m);return 0;
}
输出结果为9
。
#include<stdio.h>int main()
{int i = 1;int j = 10;int m = 0;m = i + j , j - i;printf("%d",m);return 0;
}
输出结果为11
。是因为逗号运算符的优先级低于赋值运算符,所以在计算完“i + j”之后就赋值了。
6 位运算符
位运算符要求操作数是整型数。
常见的位运算符有六种
运算符 | 含义 | 说明 |
---|---|---|
~ | 取反 | 对数据按位取反 |
& | 按位与 | 对数据按位与,1010 & 0111 = 0010 |
^ | 按位异或 | 对数据按位异或,1010 ^ 0111 = 1101 |
<< | 左移 | 按照二进制的形式把所有数字向左移动对应的位数,低位补0 |
>> | 右移 | 按照二进制的形式把所有数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,正数补0,负数补1 |
除此之外还有按位或“|”,它的作用是对数据按位或,1010 | 0111 = 1111。