赞
踩
C语言用于比较的表达式,称为“关系表达式” (relational expression),里面使用的运算符就称为“关系运算符” (relational operator),主要有下面6个。
下面是一些例子:
- 1 a == b;
- 2 a != b;
- 3 a < b;
- 4 a > b;
- 5 a <= b;
- 6 a >= b;
关系表达式通常返回 0 或 1,表示真假。
C语言中, 0 表示假,所有非0值表示真。比如, 20>12 返回1, 12>20 返回0.
关系表达式常用语 if 或 while 结构。
- 1 if (x == 3){
- 2 printf("x is 3.\n");
- 3 }
注意:相等运算符 == 与赋值运算符 = 两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。
1 if(x = 3) ...
上面的示例中,原意是 x == 3,但不小心写成 x = 3。这个式子表示对变量x赋值3,它的返回值为3,所以if判断总是为真。
为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。
1 if(3 == x) ...
这样的话,如果把 == 误写成 =,编译器就会报错。
- 1 /* 报错 */
- 2 if(3 = x) ...
另一个需要避免的错误是:多个关系运算符不宜连用。
i < j < k
上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但通常达不到想要的结果,即不是保证变量j的值在i和k之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。
(i < j) < k
上面式子中, i < j返回0或1,所以最终是0或1与变量k进行比较。如果想要判断变量j的值是否在i和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;
- }
运行代码:
这是因为,我们先拿18和age中存放的15比较,表达式18 <= 15为假,18 <= age的结果是0,再拿0和36比较,0<= 36为真,所以打印了青年,所以即使当age是15的时候,也能打印青年,逻辑上是有问题,这个代码应该怎么写呢?
- #include <stdio.h>
- int main()
- {
- int age = 0;
- scanf("%d",&age);
- if (18 <= age && age <= 36)
- {
- printf("青年\n");
- }
- return 0;
- }
以上就是关系操作符,我们需要掌握的,剩下的只要按照字面意思理解使用就行,没有特别注意的。
逻辑操作符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
比如,我们有一个变量叫 flag, 如果flag为假,要做一个什么事情,就可以这样写代码:
- 1 if(!flag)
- 2 {
- 3 printf("do something\n");
- 4 }
如果flag为真,!flag就是假,如果flag为假,!flag就是真
所以上面的代码的意思就是flag为假,执行if语句中的代码。
&& 就是与运算符,也就是并且的意思, &&是一个双目操作符,使用的方式是a&&b,&&两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。
比如:如果我们说月份是3月到5月,是春天,那使用代码怎么提现呢?
- int month = 0;
- scanf("%d",&month);
- if(month >= 3 && month <= 5)
- {
- printf("春季\n");
- }
这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足。
|| 就是或运算符,也就是或者的意思,||也是一个双目操作符,使用的方式是 a || b, || 两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
比如:我们说一年中月份是12月或者1月或者2月是冬天,那么我们怎么使用代码体现呢?
- int month = 0;
- scanf("%d",&month);
- if(month == 12 || month == 1 || month == 2)
- {
- printf("冬季\n");
- }
2.4、练习:闰年的判断
输入一个年份year,判断year是否是闰年
- 闰年判断的规则:
- 1、能被4整除并且不能被100整除是闰年
- 2、能被400整除是闰年
参考代码:
- //代码1
- #include <stdio.h>
- int main()
- {
- int year = 0;
- scanf("%d", &year);
- if (year % 4 == 0 && year % 100 != 0)
- printf("是闰年\n");
- else if(year%400 == 0 )
- printf("是闰年\n");
- return 0;
- }
- //代码2
- #include <stdio.h>
- int main()
- {
- int year = 0;
- scanf("%d", &year);
- if (year % 4 == 0 && year % 100 != 0 || year%400 == 0)
- printf("是闰年\n");
- return 0;
- }
2.5、短路
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
如前面的代码:
if(month >= 3 && month <= 5 )
表达式中&&的左操作数是 month >= 3,右操作数是 month <= 5, 当左操作数 month>=3的结果为0的时候,即使不判断 month <= 5,整个表达式的结果也是0 (不是春季)。
所以,对于 && 操作符来说,左边操作数的结果为0时,将不再执行右操作数。
例如:
- #include <stdio.h>
-
- int main()
- {
- int a = 0;
- int b = 1;
- if(a++ && b++)
- printf("true");
- else
- printf("a=%d,b=%d",a,b);
- return 0;
- }
运行结果:
注意:a++表示先用再加,++a表示先加后用
在上面的代码中,在if语句中,a++由于先用后加,所以此时a++为0。由于与运算的短路特性,if语句中表达式直接为0,直接跳到else语句,不再计算b++,因此a=1,b=1。
对于||操作符,如果左操作符为真时,右操作符不再计算。
像这种仅仅根据左操作数结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。