C语言零基础学习笔记8——分支和循环(二)

本节大纲


一、if 语句

二、关系操作符

三、条件操作符

四、逻辑操作符:&&、||、!


三、条件操作符

        条件操作符也叫三目操作符(C语言只有一个三目操作符),需要接受三个操作数的,语法形式如下:

exp1 ? exp2 : exp3

         条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。

        比如下面这段我们用可以看懂的if……else……语句所写的代码,是可以拿条件操作符改写的。

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d", &a);
	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", &a);
	b = a > 5 ? 3 : -3;
	printf("%d\n", b);
	return 0;
}

        从上面的示例中我们可以大致了解了条件运算符的使用规则,下面我们来做一个练习,利用条件运算符实现“找出两个整数中的较大值,并打印出来”,大家可以自行编程,下面是我的代码: 

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int max = 0;
	printf("请输入两个整数:");
	scanf("%d%d", &a, &b);
	max = a > b ? a : b;
	printf("这两个整数中,较大值是:%d", max);
	return 0;
}

<兴趣拓展——逗号表达式>

        在C语言中,逗号运算符(,)用于将多个表达式组合在一起,形成一个逗号表达式。逗号表达式的求值顺序是按照从左到右的顺序,即先计算左侧的表达式,然后计算右侧的表达式。但是,整个逗号表达式的最终结果是最右侧表达式的值。逗号表达式的一般形式如下:

expression1, expression2, ..., expressionN;

        其中,expression1 到 expressionN 是按顺序计算的表达式。

        逗号表达式需要通常用于循环中,特别是在需要在每次迭代中执行多个操作时。


四、逻辑操作符:&&、||、!

        逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

· ! :逻辑取反运算符(改变单个表达式的真假)。

· && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。

· || :或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。

(一)、逻辑取反运算符 !

         比如,我们有一个变量叫 flag ,如果flag为假,要做一个什么事情,就可以这样写代码:

#include <stdio.h>
int main()
{
	int flag = 0;
	if (!flag)
	//这句话等同于 if(flag == 0)
	//这句话也等同于 if(!flag == 1)
		{
		printf("do something\n");
		}
	return 0;
}

        如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真

        所以上面的代码的意思就是 flag 为假,执行if语句中的代码。

(二)、与运算符 &&

 

        && 就是与运算符,是并且的意思, && 是一个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。

        比如我们想表达“输入一个月份,如果是3月份到5月份,那就打印‘春季’”,实现这段代码就可以使用与运算符实现,代码如下:

#include <stdio.h>
int main()
{
	int month = 0;
	printf("请输入一个月份:");
	scanf("%d", &month);
	if (month >= 3 && month <= 5)
		printf("春季");
	return 0;
}

        这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足,才能打印“春季”。

(三)、或运算符 ||

        || 就是或运算符,也就是或者的意思, || 也是一个双目操作符,使用的方式是 a || b , || 两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

        比如我们想表达“输入一个月份,如果是12月份、1月份或者2月份,那就打印‘冬季’”,实现这段代码就可以使用或运算符实现,代码如下:

#include <stdio.h>
int main()
{
	int month = 0;
	printf("请输入一个月份:");
	scanf("%d", &month);
	if (month == 12 || month == 1 || month == 2)
		printf("冬季");
	return 0;
}
(四)、练习——闰年的判断

        经过上面的学习,我们已经可以独立完成一些较为复杂的程序了,比如说我们接下来完成一个“判断闰年”的练习,判断闰年的规则为:能被4整除并且不能被100整除的是闰年或者能被400整除的也是闰年。

        我们可以独立编写代码实现上面所说的功能,我给出两种解决方式,第一种使用if嵌套语句来实现,第二种使用与运算符与或运算符的综合使用来实现。

        下面是这两种解决方式的代码:

//方法一
#include <stdio.h>
int main(){
	int year = 0;
	printf("请输入一个年份:");
	scanf("%d", &year);
	if (year % 4 == 0 && year % 100 != 0)
		printf("您输入的年份是闰年");
	else if (year % 400 == 0)
		printf("您输入的年份是闰年");
	else
		printf("您输入的年份不是闰年");
	return 0;
}
//方法二
#include <stdio.h>
int main(){
	int year = 0;
	printf("请输入一个年份:");
	scanf("%d", &year);
	if ((year % 4 == 0 && year % 100 != 0)|| (year % 400 == 0))
		printf("您输入的年份是闰年");
	else
		printf("您输入的年份不是闰年");
	return 0;
}
(五)、短路

        C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是固定的。

        如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

        比如上面(二)中示例的代码:

	if (month >= 3 && month <= 5)

        表达式中 && 的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的

        结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。

        所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行。

        对于 || 操作符,我们结合上面(三)中示例的代码:

	if (month == 12 || month == 1 || month == 2)

        如果month == 12,则不用再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。

        所以, || 操作符的左操作数的结果不为0时,就无需执行右操作数。

        像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。

        这种短路问题往往会在大学《C语言程序设计》课程的测试中出现给一段程序让我们写程序结果的问题,比如我们看下面这段代码并计算代码输出的结果:

#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf("i = %d a = %d  b = %d  c = %d  d = %d\n",i, a, b, c, d);
	i = a++ || ++b || d++;
	printf("i = %d a = %d  b = %d  c = %d  d = %d\n", i, a, b, c, d);
	return 0;
}

        这段代码的运行结果为:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值