1.关系操作符
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称
为“关系运算符”(relational operator),主要有下⾯6个。
• > ⼤于if (x == 3) {
printf("x is 3.\n");
}符
• < ⼩于运算符
• >= ⼤于等于运算符
• <= ⼩于等于运算符
• == 相等运算符
• != 不相等运算符
关系表达式通常返回 0 或 1 ,表⽰真假。
C 语⾔中, 0 表⽰假,所有⾮零值表⽰真。⽐如, 20 > 12 返回 1 , 12 > 20 返回 0 。关系表达式常⽤于 if 或 while 结构。如:
if (x == 3) { printf("x is 3.\n"); }
注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写
出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果,如:
if (x = 3) ...
这样的话,如果把 == 误写成 = ,编译器就会报错。
另⼀个需要避免的错误是:多个关系运算符不宜连⽤。
如下面案例:
(i < j) < k//这种写法是错误的 i < j && j < k//这种是正确的
比如说:我们输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年。
#include <stdio.h> int main() { int age = 0; scanf("%d", &age); if(18<=age<=36) { printf("⻘年\n"); } return 0; }//输入10,结果为:青年
,我们先拿18和age中存放的10⽐较,表达式18<=10为假, 18<=age 的结果是0,再拿0和
36⽐较,0<=36为真,所以打印了 ⻘年
2.条件操作符(c语言唯一3目操作符)
条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果
exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
如:
#include <stdio.h> int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); if (a > 5) b = 3; else b = -3; printf("%d\n", b); return 0; } 改造后: #include <stdio.h> int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); b = a>5 ? 3:-3; printf("%d\n", b); return 0; }
3. 逻辑操作符:&& , || , !
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符:
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
注:C语⾔中,⾮0表⽰真,0表⽰假
逻辑取反运算符
下面例子:
#include <stdio.h> int main() { int flag = 0; if(!flag) { printf("do something\n"); } return 0; }
如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真
所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。
4. 短路
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是
保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
如前⾯的代码:
if(month >= 3 && month <= 5)
如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。
所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短
路求值。
int i = 0,a=0,b=2,d=4;
i = a++ || ++b || d++;//计算代码输出的结果
//结果为a=1,b=3,d=4 原因:a是使用在++,所以第一个||左边为0,即假,第一个||又边为真,第2个||后面不用计算,所以d不用加。
算数操作符:+、-、*、/、%
/
运算符 / ⽤来完成除法。
除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。
#include <stdio.h> int main() { float x = 6 / 4; int y = 6 / 4; printf("%f\n", x); // 输出 1.000000 printf("%d\n", y); // 输出 1 return 0; }
上⾯⽰例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,⽽不是
1.5 。原因就在于 C 语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。
如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法。
#include <stdio.h> int main() { float x = 6.0 / 4; // 或者写成 6 / 4.0 printf("%f\n", x); // 输出 1.500000 return 0; }
上⾯⽰例中, 6.0 / 4 表⽰进⾏浮点数除法,得到的结果就是 1.5 。
再看⼀个例⼦:
#include <stdio.h> int main() { int score = 5; score = (score / 20) * 100; return 0; }
上⾯的代码,你可能觉得经过运算, score 会等于 25 ,但是实际上 score 等于 0 。这是因为
score / 20 是整除,会得到⼀个整数值 0 ,所以乘以 100 后得到的也是 0 。
为了得到预想的结果,可以将除数 20 改成 20.0 ,让整除变成浮点数除法。
%
运算符 % 表⽰求模运算,即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点数。