关于C语言分支语句的学习心得-关系操作符

C语言程序设计中有顺序语句、分支语句、循环语句3中类型,今天学习分支语句预备知识关系操作符

1、== 等于 操作符

int main()
{
	int a = (3 == 5);
	int b = (2 == 2);
	printf("a = %d\nb = %d\n",a,b);
	// 因为 3 == 5 为假 即为0
	// 所以 a被赋值为0 ,输出为 a = 0
	// 因为 2 == 2 为真 即为1
	// 所以 b被赋值为2 ,输出为 b = 2
	return 0;
}

由于在写程序时,常常因为失误将==等于操作符写为 = ,所以在常量和一个变量比较大小时,将常量放在 == 的左边,防止少写一个 = ,变为赋值运算符。

// 当一个常量和一个变量比较大小的时候
// 建议将常量放在 == 的左面
int main()
{
	int a = 5;
	if (5 == a) // 因为 a = 5 始终为真,if 条件始终都会执行
		printf("hehe\n");
	return 0;
}

而且关系操作符不宜连续使用

// 关系运算符不宜连用
int main()
{
	int a = 3;
	int b = 7;
	int c = 4;
	if (a < b < c)
		printf("hehe\n");
	/*
		为什么关系运算符不宜连用
		if (a < b < c)
		先计算:a < b 为真即为1
		再计算:1 < c 为真即为1
		所以程序会执行printf,打印hehe
		需要写成:a < b && b < c
	*/
	return 0;
}

注意:< 的优先级高于 && ,所以在a < b && b<c 中,不需要加(),写为(a<b)&&(b<c)

 2、三目运算符

exp1 ? exp2 :exp3

先计算exp1的结果

若exp1为真,则计算exp2的结果作为表达式的结果

若exp1为假,则计算exp3的结果作为表达式的结果

int main()
{// 这段程序就在模拟三目运算符
	int a = 0;
	int b = 0;
	scanf("%d",&a);
	if (a > 5)
		b = 3;
	else
		b = -3;
	// 用三目运算符表达
	b = a > 3 ? 3 : -3;
	return 0;
}
// 使用条件表达式实现找两个数中较大值
int main()
{
	int a = 34;
	int b = 44;
	int ret = a > b ? a : b;
	printf("%d\n",ret);
	return 0;
}

3、逻辑操作符

! :逻辑取反运算符(改变单个表达式的真假)即1改变为0,0改为变1

int main()
{
	int flag = 5;
	int ret = scanf("%d",&flag); // 0
	if (!flag)// flag 为假时,执行printf语句
		printf("hehe\0");
	return 0;
}

&& :逻辑与,表达式两端同时为真,整个表达式才为真,否则为假

// 3~5为春天
int main()
{
	int month = 0;
	int ret = scanf("%d",&month); 
	if (month >= 3 && month <= 5) // &&并且 表达式两端都为真,if表达式才成立
		printf("春天");
	return 0;
}

|| :逻辑或,表达式两端有一个为真,整个表达式即为真,否则为假

// 12 1 2 是冬天
int main()
{
	int month = 0;
	int ret = scanf("%d",&month); 
	if (month == 12 || month == 1 || month == 2) 
// || 连接的3个表达式有一个为真,if表达式为真
		printf("冬天");
	return 0;
}

4、逻辑短路下的赋值操作

关系运算符两侧先对左侧表达式求值,再对右侧表达式求值,这个顺序是保证的

如果左边的表达式满足逻辑运算符的条件,那就不对右侧表达式进行求值了,这种情况叫做“短路"

例如: if(month >= 3 && month <= 5)

如果:month >= 3 为假 ,那么即使不判断 Month <= 5 整个表达式的结果也为0,所以右侧的month<=5就不在计算了

例如: if(month == 12 || month == 1 || month == 2)

如果:month == 12 即使不计算后续的month == 1和month == 2 整个表达式的结果也为1

像这也仅仅根据左操作数就能直到整个表达式结果,不再对右侧操作数进行计算的运算称为“短路求值”

逻辑短路是为了减少系统处理的数据,但是在编程时如果不加注意,非常容易出现逻辑错误

​int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	// 因为是a++,先使用再++,所以a= 0,使用后a++,a=1,即0 && ++b && d++
	// 此时关系表达式“短路”,后续关系表达式不再需要,即计算保持原值
    // 所以输出为 1 2 3 4 
	return 0;
}
int main()
{	// 此时a = 1
	int i = 0, a = 1, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	//i = a++||++b||d++;
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	// 因为是a++,先使用再++,所以a= 1,使用后a++,a=2,即1 && ++b && d++
	// ++b 先++ 再使用,1 && 3 &&d ,b++ 后 b+1 = 3
	// d++ 先使用再++ 1 && 3 && 4 ,后d+1 = 5
	// 2 3 3 5
	return 0;
}

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值