与运算符、或运算符、短路问题

&&(与运算符)表示并且的意思。||(或运算符)表示或者的意思。

与运算符和或运算符都是双目操作符(因为两者都有左右两个表达式)。

在条件判断语句中:

当使用&&(与运算符)时,只有左右两边表达式都成立时,才能满足条件,执行条件判断语句中的代码。

if ( num >= 5 && num <= 9)

上述代码中,只有&&(与运算符)的左侧表达式为真,即当num的值大于等于5的时候,才会执行右侧的表达式,当右侧的表达式也为真时,才能执行if语句中的代码。

如果&&(与运算符)的左侧表达式不成立的话,那么右边的表达式将不再执行。

当使用||(或运算符)时,只要左右两边表达式中有一个成立时,就能满足条件,执行条件判断语句中的代码。

if ( num == 1 || num == 2 || num ==3 )

上述代码中,如果num的值为1,则只用执行最左侧的表达式即可,如果num的值位2,则需要依次执行最左侧的表达式和中间的表达式,如果num的值为3,则需要依次执行最左侧的表达式、中间的表达式、最右侧的表达式。只要num符合上述三个表达式中的一个,就可以执行if语句中的代码。

自增符:

a++表示先使用a,在让a自加1。

++a表示想让a自加1,在使用a。

#include <stdio.h>

int main()
{
	int a = 6;
	int b = a++;
	int c = ++a;
	printf("a=%d b=%d c=%d", a, b, c);

	return 0;
}

运行结果:

a=8 b=6 c=8

 分析步骤:

①a的初始值为6 

②在 int b = a++;中,先将a的值赋值给b,然后a自加1变为7

③在 int c = ++a;中,a先自加1变为8,然后将值赋值给c

故可得上述运行的结果。

自减符:

a--表示先使用a,在让a自减1。

--a表示想让a自减1,在使用a。

#include <stdio.h>

int main()
{
	int a = 6;
	int b = a--;
	int c = --a;
	printf("a=%d b=%d c=%d", a, b, c);

	return 0;
}

运行结果:

a=4 b=6 c=4

 分析:

①a的初始值为6 

②在 int b = a--;中,先将a的值赋值给b,然后a自减1变为5

③在 int c = ++a;中,a先自减1变为4,然后将值赋值给c

故可得上述运行的结果。

c语言逻辑运算符的特点:先对左侧的表达式求值,在对右侧的表达式求值。当左边的表达式满足逻辑运算符的条件时,不在对右边的表达式求值,这种情况被称为短路。   

c语言中,若表达式为假,则为0,为真,则为1,非零均表示真

#include <stdio.h>

int main()
{
	int i = 0, a = 5, b = 6, c = 7;
	i = a++ && ++b && c++;
	printf("i=%d a=%d b=%d c=%d", i, a, b, c);

	return 0;
}

运行结果:

i=1 a=6 b=7 c=8

重要步骤分析:(先分析最左侧与运算符的两个表达式)

在表达式 i = a++ && ++b && c++;中,先执行左侧的表达式a++,因a为5,故表示真,执行之后a自加1变为6,然后执行表达式++b(b先自加1变为7, 表示真)。此时,可以将前两个表达式看为与运算符的左边的表达式,易知,此时左边的表达式为真。最后执行右边的表达式c++,因c为7,故表示真,执行之后c自加1变为8,故最终可知这三个表达式都表示为真,故i的值为1(c语言中,若表达式为假,则为0,为真,则为1,非零均表示真)

在其他条件不变的情况下,上述整型变量a的值为0,则运行结果为:

i=0 a=1 b=6 c=7

原因:在表达式 i = a++ && ++b && c++;中 逻辑操作符均为&&(与操作符),故表达式都为真是,i的值才为1。

在表达式 i = a++ && ++b && c++;中,先执行左侧的表达式a++,因a为0,故表示假,执行之后a自加1变为1,又逻辑操作符都是&&(与操作符)故将表达式执行完后,其结果一定为假,因此,也没必要执行后面的表达式。(在执行程序时,后面两个表达式是不会执行的,这种情况称为短路)

#include <stdio.h>

int main()
{
	int i = 0, a = 5, b = 6, c = 7;
	i = a++ || ++b || c++;
	printf("i=%d a=%d b=%d c=%d", i, a, b, c);

	return 0;
}

运行结果:

i=1 a=6 b=6 c=7

分析:

在表达式 i = a++ || ++b || c++;中,先执行左侧的表达式a++,因a为5,故表示真,执行之后a自加1变为6。因为逻辑操作符均为或||(操作符)故只要一个表达式为真即可,故i的值为1。

因为第一个表达式已经符合条件(即为真),故不会执行后面的表达式。

#include <stdio.h>

int main()
{
	int i = 0, a = 0, b = 6, c = 7;
	i = a++ || ++b && c++;
	printf("i=%d a=%d b=%d c=%d", i, a, b, c);

	return 0;
}

运行结果:

i=1 a=1 b=7 c=8

分析:

在表达式 i = a++ || ++b && c++;中,先执行左侧的表达式a++,因a为0,故表示假,执行之后a自加1变为1,然后执行表达式 ++b(b先自加1变为7,表示真),故||(或操作符)的结果为真,最后执行表达式c++,因c为7,故表示真,执行之后c自加1变为8

由&&(与运算符)知,最终结果为真,故i的值为1。

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值