关系运算符
关系运算符也叫比较运算符,像数学中10 > 9、1 < x < 5 等等,表示一种判定关系,给出的这种关系可能是正确的也可能是错误的,例如可以有“1 > 2”这种判定,但这是错误的判断。
计算机中也支持这种判定,但结果只有两种,要么判断正确要么判断错误。
正确则称为“真”,错误则称为“假”。任意给出这样一个判定,要么为真要么为假并不会出现其他情况,并且也不会出现相同的判定在一种情况下为真、另一种情况下为假的情况。
C/C++中提供了多种用于判断两个表达式关系的运算符:
运算符 | 作用 |
---|---|
== | 判定两个表达式的值相等 |
!= | 判定两个表达式的值不相等 |
> | 判定左边表达式的值大于右边表达式的值 |
< | 判定左边表达式的值小于右边表达式的值 |
>= | 判定左边表达式的值大于或等于右边表达式的值 |
<= | 判定左边表达式的值小于或等于右边表达式的值 |
其中要注意的是,其中的 >= 实际意思是:大于或者等于只要一个成立则整个判断为真(<= 同理),例如:
int a = 5;
int b = 3;
a > b // 值为真
a >= b // 虽然等于不成立,但大于成立,所以判断也为真
逻辑运算符
在数学中,我们可以使用像“1 < x < 4”这种联合的判定。但C/C++中不能直接这样使用,例如:
int x = 3;
1 < x < 4 // 这是错误的语法
“1 < x < 4”表示的是x > 1 而且 x < 4,要使用这种联合的判定,要使用逻辑运算符连接多个判定条件。
运算符 | 作用 |
---|---|
&& | 两个判定条件同时为真则整个判定条件为真,否则为假 |
|| | 两个判定条件至少有一个为真则整个判定条件为真,否则为假 |
! | 原判断条件为真则整个判定条件为假,反之亦然 |
例如:
int a = 1;
int b = 4;
int c = 7;
(a < b) && (b < c) // 两个条件均为真,整个判定为真
(a > b) || (b < c) // 两个条件至少一个为真,整个判定为真
!( a == b) // 原判定条件为假,整个表达式为真
&& 运算符的特点是:从左到右一次执行各个判断条件,如果遇到一个条件为假则判断整个条件为假,不再执行后面的条件。
|| 运算符的特点是:从左到右一次执行各个判断条件,如果遇到一个条件为真则判断整个条件为假,不再执行后面的条件。
对于一般的条件表达式这并不影响程序执行,但如果有赋值、自增自减表达式则可能影响变量的值,例如:
int a = 1;
int b = 3;
int c = 7;
(a > b) && (c = 10); // c的值为7,c=10不执行
(a < b) && (c = 10); // c=1不执行
c = 7;
(a > b) || (c = 10); // c的值为7,c=10不执行
(a < b) || (c = 10); // c=10执行
语句和表达式
语句是C/C++语言中的执行单位,以分号标识一条语句的结束。例如:
int a = 10; // 初始化语句
a = 20; // 赋值语句
; //空语句,什么也不做
表达式则是由运算符连接起来的各种值(字面量或者变量),表达式的特点是每个表达式都有一个值。例如:
123 // 字面量本身也是表达式,表达式的值就是变量的值
a // 变量本身也是表达式,表达式的值就是变量的值
a = 10 // 赋值表达式的值就是被赋值后该变量a的值
a++ // ++在右边时,自增表达式的值就是a的原值
++a // ++在左边时,自增表达式的值就是a自增后的值
a > b // 条件表达式的值为判断结果的值,真或假
a + b // 算数表达式的值为进行算数运算后的结果
要注意,C/C++中值都是有类型的,像之前提到,字面量有自己的识别类型、变量中的值被认为时该变量的类型。
一些表达式的值本身就直接得到,像字面量和变量本身的值。
一些表达式的值是通过计算或执行得到的,像赋值表达式、自增自减表达式、算数表达式、比较表达式都是对该表达式进行了执行、计算、判定之后得到该表达式的结果。
表达式加上分号后可以形成语句,但语句并不都是由表达式形成,例如:
int a = 10; // 初始化语句,但int a = 10 这并不是一个表达式,其中的a = 10也不应该看作赋值表带式,因为如果是数组初始化,数组名是不能被赋值的。
判断是不是表达式以及得到表达式的值,只需要将其赋值给一个变量,例如:
int a = (int b = 10); // 错误,(int b = 10)并不是表达式
int a,b,c;
a = b = c = 10; // 赋值表达式的值是赋值后变量的值,从右向左依次执行赋值运算并得到表达式的值
int a = 1 < 2; // 关系表达式的值要么为1,要么为0,分别表示真和假
非条件表达式作为条件时的真假
逻辑运算符连接的可以是条件表达式也可以是其他表达式,例如之前的代码:
(a > b) || (c = 10); // c的值为7,c=10不执行
(a < b) || (c = 10); // c=10执行
这里c = 10只是赋值表达式,而不是条件表达式但仍能作为逻辑运算符连接的一个子条件。
在C/C++中,条件表达式的值是int类型整数1或0:
struct MyStruct mt = 1 > 2; // int 0
struct MyStruct mt = 1 < 2; // int 1
而其他非条件表达式有自己的值,如果放在条件表达式的位置会根据原表达式的值被判定为真或假,
非0值的表达式被认为是真,0值表达式被认为是假:
1 // 真
a = 1 // 真
1.23 // 真
0 // 假
0.0 // 假
a = 0 // 假