一,关系运算符
1. 关系运算符
关系运算符的作用是比较符号两边的元素
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。也就是说,在一个没有括号的关系运算表达式中,<、<=、>、>=要先于==和!=发挥作用。相同级别的预算符从左向右计算。
2. 关系表达式
关系表达式的一般形式为:
表达式 关系运算符 表达式
例如:
a + b > c - d
x > 3 / 2
‘a’ + 1 < c
-i - 5 * j == k + 1
也允许出现嵌套的情况。
例如:
a > (b > c)
a != (c == d)
关系表达式的值是“真”和“假”,用“1”和“0”表示。如:
5 > 0的值为“真”,即为1;
(a = 3) > (b = 5)由于不成立,故其值为假,即为0。
例如:
#include <stdio.h>
int main(){
char c = 'k';
int i = 1, j = 2, k = 3;
float x = 3e + 5, y = 0.85;
printf("%d, %d\n", 'a' + 5 < c, -i - 2 * j >= k + 1);
printf("%d, %d\n", 1 < j < 5, x - 5.25 <= x + y);
printf("%d, %d\n", i + j + k == -2 * j, k == j == i + 5);
return 0;
}
- 字符变量以它对应的ASCII码参与运算
- 对于含多个关系运算符的表达式,如k == j == i + 5,根据运算符的左结合性,先计算k == j,该式不成立,其值为0,再计算0 == i + 5,也不成立,故表达式值为0。
是不是有点晕,如果你要参加考试,请仔细研究一下。如果你只是为了能自己写出好的程序,不用搞懂这么多,值需要知道:
表达式为真,值为1。表达式为假,值为0
需要注意的是,C语言中经常用0代表假,非零代表真。遇到了我们再说。
二,逻辑运算符
逻辑运算符相当于数学中的(且、或、非),我们叫做“逻辑与”、“逻辑或”和“逻辑非”。
&& 逻辑与
|| 逻辑或
! 逻辑非
前两个是双目运算符,最后一个是单目预算符。
我们看一段代码:
int main()
{
int a = 5 > 3; // 表示真
int b = 5 < 3; // 表示假
int x = a && a;
int y = a && b;
int z = b && b;
printf("x = %d, y = %d, z = %d\n", x, y, z);
x = a || a;
y = a || b;
z = b || b;
printf("x = %d, y = %d, z = %d\n", x, y, z);
x = !a;
y = !b;
z = !(!a);
printf("x = %d, y = %d, z = %d\n", x, y, z);
return 0;
}
先看下这段代码的运行结果:
运行结果简单说就是这样:
逻辑与:两边都为真时返回真,否则返回假;
逻辑或:只要任意一个为真就返回真,否则返回假;
逻辑非:符号右边是真,则返回假;符号右边是假,则返回真。
请仔细对照程序理解。
三,按位运算符
C语言和其它高级语言不同的是它完全支持按位运算符。这与汇编语言的位操作有些相似。
按位运算符有:
& 位逻辑与
| 位逻辑或
^ 位逻辑异或
- 位逻辑反
>> 右移
<< 左移
这部分涉及一点点汇编语言知识,不具体介绍了。有问题的同学可以私下讨论。
需要说几个特殊的应用。
1. 不申请第三个变量数值交换
这个问题经常在面试中考,就是如何在不使用第三个变量的情况下完成两个变量的数值交换。看这段代码:
int a = 1;
int b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d, b = %d\n", a, b);
大家自己去验证一下结果。
2. 最高效的乘2和除2
int a = 10;
int b = a * 2;
int c = a / 2;
printf("b = %d, c = %d\n", b, c);
这段代码大家肯定能看懂,但它还有另外一种效率更高的表达方式:
int a = 10;
int b = a << 1;
int c = a >> 1;
printf("b = %d, c = %d\n", b, c);
因为位运算得到了更多的底层优化,因此同样的功能它的效率更高。在嵌入式开发中,这种方式是被人们推崇的,因为资源有限。其他领域,人们更多地还是使用前面的方法,因为代码可读性更佳。
说远了,这些大家了解就好。
四. 特殊运算符
1. "?"运算符
"?"运算符是一个三目运算符, 其一般形式是:
<表达式1>?<表达式2>:<表达式3>;
含义:
先求表达式1的值,如果为真,则求表达式2 的值并把它作为整个表达式的值;如果表达式1的值为假,则求表达式3的值并把它作为整个表达式的值。
请看下面这段代码:
int main()
{
int x, y, z;
x = 50;
y = x > 70 ? 100 : 0;
printf("y = %d\n", y);
x = 80;
z = x > 70 ? 100 :0;
printf("z = %d\n", z);
return 0;
}
运行结果为:
运行结果仔细思考一下这个例子。后面我们会讲到的if ... else ... 的部分功能可以用这个表达式替代。
2. ","运算符
","运算符用于将多个表达式串在一起, ","运算符的左边总不返回,右边表达式的值才是整个表达式的值。
举个例子:
int main()
{
int x, y;
x = 50;
y = (x -= 5, x / 5);
printf("%d", y);
return 0;
}
这段代码的打印结果是9. 因为x的初始值为50, 减5后变为45, 45除5为9赋给y。
这个知识点常被忽略,所以被各种考试青睐。其实在真正编程中很少使用。
3. sizeof运算符
sizeof运算符是一个单目运算符, 它返回变量或类型的字节长度。
例如:
sizeof(double) // 8
sizeof(int) // 2
也可以求变量的大小, 例如:
float f;
int a = sizeof(f);
则a的值将为4。
这个预算付可以理解为一个函数,在计算结构体大小时很有用。后面会讲到。
五,C运算符的优先级
当一个表达式中有多个运算符参加运算时,将按下表所规定的优先级进行运算。表中优先级从上往下逐渐降低,同一行优先级相同。
C运算符的优先次序(1最高, 16最低)
- ()(小括号) [](数组下标) .(结构成员) ->(指针型结构成员)
- !(逻辑非) .(位取反) -(负号) ++(加1) --(减1) &(变量地址)
- *(指针所指内容) type(函数说明) sizeof(长度计算)
- *(乘) /(除) %(取模)
- +(加) -(减)
- <<(位左移) >>(位右移)
- <(小于) <=(小于等于) >(大于) >=(大于等于)
- ==(等于) !=(不等于)
- &(位与)
- ^(位异或)
- |(位或)
- &&(逻辑与)
- ||(逻辑或)
- ?:(?表达式)
- = += -=(联合操作)
- ,(逗号运算符)
这个部分教材上有大量练习题,请大家去练习一下。尤其是准备考等级考试的同学。
今天就到这里。其实这部分如果细说还有很多小点,我们这里主要抓取大的脉络,具体还需要大家学习教材,有什么问题欢迎探讨。
我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。
上一篇:C语言从零开始(六)-运算符与类型转换
下一篇:C语言从零开始(八)-标准输入输出
网友评论
int main(){
char c = 'k';
int i = 1, j = 2, k = 3;
float x = 3e + 5, y = 0.85;
printf("%d, %d\n", 'a' + 5 < c, -i - 2 * j >= k + 1);
printf("%d, %d\n", 1 < j < 5, x - 5.25 <= x + y);
printf("%d, %d\n", i + j + k == -2 * j, k == j == i + 5);
return 0;
}
提示float x = 3e + 5那有错误
|error: exponent has no digits|
但把e改成数字之后就可以了
新人不是很懂是什么原因(编译器不同造成的?)能解释一下吗
int main()
{
int x, y, z;
x = 520;
y = x > 1111 ? 1314 : 88;
printf("y = %d\n", y);
x = 1314;
z = x > 1111 ? 520 :88;
printf("z = %d\n", z);
return 0;
}
520