分支和循环(上)

       C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语言是能够实现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。
       我们可以使用 if 、 switch 实现分支结构,使用 for 、 while 、 do while 实现循环结构。

1.  if语句

1.1  if

        if语句的语法形式如下:

if (表达式)
    语句 

       表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。在C语言中,0为假,非0表示真,也就是表达式的结果如果为0,则语句不执行,表达式的结果如果非0,则语句执行。

1.2 else

        如果一个数不是奇数,那就是偶数了,如果任意一个整数,我们要清楚的判断是奇数还是偶数怎么表示呢这里就需要 if...else... 语句了,语法形式如下:

if (表达式)
    语句1
else
    语句2
1.3 分支中包含多条语句

         默认在 if 和 else 语句中默认都只控制一条语句。如下列三图,当n==20时符合 if 中的条件, if 后打印出“成年了”“可以谈恋爱了”两条语句,但是当n==15时不符合 if 条件,只打印出“可以谈恋爱了”。

         不管符不符合 if 条件,都打印出了“可以谈恋爱了” 。可见,if 只控制了“成年了”这条语句

int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
		printf("成年了\n");
		printf("可以谈恋爱了\n");
	return 0;
}

       那如果我们要if语句同时控制2条以上语句,怎么办呢?那就要使用大括号 {} 将代码括起来,else后也可以跟上大括号。(保险起见,建议不管一句还是多条语句,都加上括号),如下

#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
    {
        printf("成年了\n");
        printf("可以谈恋爱了\n");
    }
    return 0;
}
1.4 嵌套if

       在 if else 语句中, else 可以与另⼀个 if 语句连用,构成多重判断。

       else if 嵌套:

int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num == 0)
		printf("数字是0\n");
	else if (num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
		printf("数字是正数\n");
	else
		printf("数字是负数\n");
	return 0;
}

       if else 里嵌套 if else :

int main()
{
	int num = 0;
	scanf("%d", &num);
		if (num > 0)
		{
			if (num % 2 == 0)//if语句 里嵌套if else语句
				printf("偶数\n");
			else
				printf("奇数\n");
		}
		else
		{
			printf("⾮正数\n");
		}
	return 0;
}
1.5 悬空else问题

       如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

       程序运行的结果是啥?
       很多初学者,上来以判断 a 是0,不等于1,那就执行else 子句,打印 haha 但是当你去运行代码,输出的结果是:啥都不输出。
       为什么呢?
       这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
       上面的代码排版,让 else 和第⼀个 if 语句对齐,让我们以为 else 是和第⼀个if匹配的,当 if 语句不成立的时候,自然想到的就是执行 else 语句,打印 haha ,但实际上 else 是和第二个 if 进行匹配的,这样后边的 if...else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印
如果代码改成下面这样就更加容易理解了

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
            printf("hehe\n");
        else
            printf("haha\n");
    }
    return 0;
}

       只要带上适当的大括号,代码的逻辑就会更加的清晰,所以大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。

2. 关系操作符

       C语言用于比较的表达式,称为“关系表达式”(relational expression),里面使用的运算符就称为“关系运算符”(relational?operator),主要有下面6个:
• > 大于运算符
• < 小于运算符
• >= 大于等于运算符
• <= 小于等于运算符
• == 相等运算符
• != 不相等运算符

       关系表达式通常返回 0 或 1 ,表示真假。
       C语言中, 0 表示假,所有非零值表示真。比如, 20 > 12 为真返回 1 , 12 > 20为假返回 0

       注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写错误的代码,它可以运行,但很容易出现意料之外的结果。为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。这样的话,如果把 == 误写成 = ,编译器就会报错。

if (3 = x) ...

       另⼀个需要避免的错误是:多个关系运算符不宜连用。

i < j < k 

       上面式子中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进行比较。如果想要判断变量 j
的值是否在 i 和 k 之间,应该使用下面的写法:

(i < j) < k 

3. 条件操作符

       条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:

exp1 ? exp2 : exp3 

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

4. 逻辑操作符:&&  ,  ||  ,  !

       逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下面三个运算符。
       • ! :逻辑取反运算符(改变单个表达式的真假)。
       • && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
       • || :或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
       注:C语言中,非0表示真,0表示假。

4.1 逻辑取反运算符  !

4.2 与运算符 &&

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

4.3 或运算符 ||

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

4.4 短路

       C语言逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值