- 在正式开始之前,我们还是借助一张思维导图帮助大致简单回忆一下有关操作符的基础内容
- 今天咱们接着单目操作符后朝下讲
一.关系操作符
> >= < <= != 用于测试“不相等” == 用于测试“相等”
这些关系运算符比较简单,没什么可讲的,但是我们要注意一些运算符使用时候的陷阱。
比如下面的代码:
#include<stdio.h> //判断并在屏幕上打印闰年 int main() { int y = 0; scanf("%d", &y); //1. 能被4整除,并且不能被100整除 //2. 能被400整除是闰年 if (((y % 4 = 0) && (y % 100 != 0)) || (y % 400 == 0)) { printf("闰年\n"); } else { printf("不是闰年\n"); } return 0; }
我们这段代码中,想要判断的是输入的年数是否能被4整除,但是注意这里:
if (((y % 4 = 0) && (y % 100 != 0)) || (y % 400 == 0))
我们在这里由于不小心把”y%4==“0写成了把0的值赋给y%4,此时程序连编译器都过不去。
警告:
在编程的过程中== 和=不小心写错,导致的错误
良好的代码风格
注意,在某些情况下,类似“==”和“=”用错时,编译器是不会报错的。
int main() { int x = 0; if (x = 1) { printf("HEHE\n"); } else printf("haha\n"); return 0; }
我们这里x初始化的值是0,应该打印“haha”,但是由于我们错误的将“==”写成“=”,
所以导致错误的打印“HEHE”,编译器此时并没有报错,因为从逻辑上来说这段代码并没有错,那此时我们怎样修改代码能使编译器提醒我们此时代码存在错误呢?
int main() { int x = 0; if (1=x) { printf("HEHE\n"); } else printf("haha\n"); return 0; }
我们可以调换左右数的位置,由于我们不可能把一个变量的值赋给一个常量,因此我们就可以通过这样的方式来提醒我们代码是否有误
正确的代码
int main() { int x = 0; if (1==x) { printf("HEHE\n"); } else printf("haha\n"); return 0; }
像上述这种只需要通过简单的修改就能帮助我们找到代码中可能出现的bug无疑就是良好的代码风格!!
二.逻辑操作符
逻辑操作符有哪些:
&& 逻辑与 || 逻辑或
区分逻辑与和按位与
区分逻辑或和按位或
1&2----->0//按位与作用与二进制补码,对应二进制位数都为1才为1,否则为0 1&&2---->1//一般作用于两边的条件,当两边的条件都i为真时才为真,否则为假 1|2----->3//按位或也是作用于二进制补码,对应二进制位数只要有一个为1就为1,只有两个同时为0才为0 1||2---->1//逻辑与两边条件只要有一个为真就为真,只有都为假才是假
关于按位与,按位或等的位操作符知识我在第一篇操作符详解中已经讲过了,感兴趣的可以看看以下链接:
【C语言初阶】带你轻松玩转所有常用操作符(1) ——算数操作符,移位操作符,位操作符
逻辑操作符应用面试题实例
下面举一道大厂的相关面试题来加深大家对逻辑操作符的印象。
代码如下:
#include <stdio.h> int main() { int i = 0,a=0,b=2,c =3,d=4; i = a++ && ++b && d++; printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d); return 0; }
试判断一下上述程序运行起来的结果:
为什么?
我们说了,逻辑与只要有一个条件不满足条件,则为假,此时当程序运行到a++时,由于是后置++,a此时等于0,等于0就是为假的意思,该行代码不再朝下继续运行下去直接停止,此时只有a后置加了个1,bcd的值则不变,因此出现上述打印的结果。
那代码如果是这样呢?
#include <stdio.h> int main() { int i = 0,a=0,b=2,c =3,d=4; i = a++||++b||d++; printf("a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d); return 0; }
这段代码的结果又是如何呢?
这又是为啥?
我们知道,逻辑或是只要||两边有一个条件满足则为真,我们带入此时a=0;此时后置++,传入的依旧是0为假,逻辑或继续朝下运行,前置++b,此时b=3,为真,逻辑或就不再朝下运行了,此时只有a和b的值加了1其余则为原数,因此打印的是屏幕上的结果。
通过上述两个面试题的例子,我相信你对逻辑操作符应该有了你自己的见解,那我们继续朝下学习。
三.条件操作符
exp1 ? exp2 : exp3//判断表达式1真假,条件如果为真,则执行表达式2,如果为假,则执行表达式3
因此上面的代码用if也可以实现
if(exp1) exp2; else exp3;
举个简单的代码例子吧
int main() { int a = 0; int b = 0; if (a > 5) b = 3; else b = -3; return 0; }
用条件操作符实现;
int main() { int a=0; int b=0; //(a > 5) ? (b = 3) : (b = -3); b = ((a > 5) ? (3) : (-3));//与上一行代码两者等价 return 0; }
逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
举几个示例代码
int main() { //代码1 int a = 1; int b = 2; int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式 printf("%d\n", a); printf("%d\n", b); printf("%d\n", c); //代码2 //if (a = b + 1, c = a / 2, d > 0) //代码3 //a = get_val(); //count_val(a); //while (a > 0) //{ // // //业务处理 // a = get_val(); // count_val(a); //} //如果使用逗号表达式,改写: //while (a = get_val(), count_val(a), a > 0) return 0; }
如果你对上述代码的理解有问题,不妨自己试着去运行一下哦!,这里就不细讲了。
总结
今天的内容暂时到这里就结束了,我们今天讲了有关 关系操作符,逻辑操作符,条件操作符以及逗号表达式的应用以及易错点。如果你还有所困惑不妨自己动手实操一下,这方面的知识是需要记忆的,咱们必须反复的练习才能熟悉起来!
以上就是关于操作符的第三部分内容,后面其他的操作符应用详解会在近期分批次更新,敬请期待!!
好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**