正文开始——
C语言是一门结构化的程序设计语言,这里的结构指:顺序结构、选择结构、循环结构。
语法形式如下:
1 if (表达式) 2 语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
在C语言中,0为假,非0为真,也就是表达式的结果如果是0,则语句不执行,表达式的结果非0,则语句执行。
例如:输入一个整数,判断是否为奇数
if...esle 语句
语法形式如下:
1 if (表达式) 2 语句1 3 else 4 语句2
例如:输入一个整数,判断是否为奇数,如果是奇数打印奇数,否则打印偶数。
练习:输入一个年龄,>=18就输出:成年,否则就输出:未成年。
默认在 if 和 else 语句中都只控制一条语句。
比如:
有代码运行结果可知:无论输入的值是否大于等于18,“可以恋爱了” 都会打印在屏幕上。
why?
因为 if 语句只能控制后面的一条语句,第二条 printf()语句是独立存在的,不管 if 语句为真假,第二条 printf()语句都会执行。此时,可以用 { } 将代码括起来,else 同理。
在 if else 语句中,else 可以与另一个 if 语句连用,构成多重判断。
比如:
有了 if 语句的嵌套用法,就可以完成更多复杂逻辑的判断。
如果有多个 if 和 else ,可以记住一条规则,else 总是跟最接近的 if 匹配。
此代码运行的结果就是啥都不输出。
why?
else 与最近的 if 匹配,但是第一个 if 语句就不成立,嵌套的 if 和 else 就没机会执行,所以最终啥都不打印。代码进行下面的改写比较容易理解。
或者我们希望 else 确实和第一个 if 匹配,就可以这样写:
适当的加上大括号 { } 可以让代码逻辑变得更清晰,提高其可读性。
C语言用于比较的表达式叫做关系表达式,里面的运算符就称为关系运算符,主要有下面6个:
下面是一些例子:
1 a == b; 2 a != b; 3 a > b; 4 a < b; 5 a >= b; 6 a <= b;
关系表达式通常返回0或1,表示真假。
C语言中,0 表示假,所有非 0 值表示真。
比如,20 > 12,返回1,12 > 20,返回 0。
关系表达式常用于 if 或while 结构。
1 if (x==3) 2 { 3 printf ("x is 3.\n"); 4 }
注意1:
相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候不小心写成下面的代码,它可以运行,但结果不可预料。
1 if (x=3)...
上面的代码中,目的是 x==3,但是写成了x=3。这个式子表示对变量 x 赋值3,它的返回值为3,所以 if 判断为真。
为了防止出现这种错误,我们可以把变量写在等号的右边。
1 if (3==x)...
这样的话,如果把 == 写成 = 编译器就会报错。
注意2:
多个关系运算符不宜连用。
1 i < j < k
上面代码中,连续使用两个小于运算符。这是合法表达式,不会报错,但通常达不到想要的结果,既不是保证变量 j 的值在 i 和 k 之间。因为关系表达式是从左到右计算,所以实际执行的是下面的计算逻辑。
1 (i < j)< k
上面代码中,i < j 实际返回的是0或1,所以最终是0或1与变量 k 进行比较。如果想要判断 j 是否在 i 和 k 之间,应使用下面的写法:
1 i < j && j < k
例如:我们输入一个年龄,如果年龄在18~36之间,我们输出青年。
当我们输入56时依然输出青年。
why?
因为18先与我们输入的56比较,表达式18<=56为真,所以其表达式结果为1,再拿1与36比较,为真,所以打印青年。那么我们该如何修正呢?见下:
条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:
1 exp1 ? exp2 : exp3
计算逻辑:
如果exp1为真,exp2计算,计算的结果是整个表达式的结果;如果exp1为假,exp3计算,计算的结果是整个表达式的结果。
练习1:使用条件操作符表示下面代码的逻辑
练习2:使用条件表达式实现找两个数中较大值。
逻辑操作符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
逻辑取反运算符
比如,我们有一个变量叫 flag,如果 flag 为假,要做一个什么事情,就可以这样写代码:
如果 flag 为真,!flag就是假,如果 flag 为假,!flag就是真
所以上面代码的意思就是 flag 为假,执行 if 语句中的代码。
逻辑与
&& 就是与运算符,也是并且的意思,&& 是一个双目操作符,使用的方式是 a&&b,&& 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。
练习:如果我们说月份是3月到5月,是春天,用代码实现。
这里的 month 就是大于等于3,小于等于5,都要满足,用 && 正合适 。
|| 就是或运算符,也就是或者的意思,|| 也是一个双目操作符,使用的方式是 a || b,|| 两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
练习:我们说一年中月份是12月或者1月或者2月是冬天。
闰年的判断规则:
1. 能被4整除并且不能被100整除
2. 能被400整除是闰年
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右侧的表达式求值,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。 这种情况称为“短路”。
1 if ( month >= 3 && month <= 5 )
表达式中 && 的左操作数是 month >= 3,右操作数是 month <= 5,当左操作数 month >= 3 的结果是0的时候,即使不判断 month <= 5,整个表达式的结果也是0(不是春季)。
1 if ( month==12 || month==1 || month==2 )
如果 month==12,则不用再判断 month是否等于1或2,整个表达式的结果也是1(冬季)。
所以,|| 操作符的左操作数的结果不为0时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
思考思考,如果是 || 结果又是什么呢?
除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。
switch 语句是一种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
1 switch (expression) 2 { 3 case value1:statement 4 case value2:statement 5 default:statement 6 }
上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 子句。
注:
练习:输入任意一个整数值,计算除3之后的余数
如果使用 if 语句完成,如下:
注:
1. case 和后边的数字之间必须有空格
2. 每一个 case 语句中的代码执行完成后,需要加上 break,才能跳出这个 switch 语句
前面的代码中,我们去掉 break,会出现怎样的情况呢?
why?
原因是 switch 语句也是有分支效果的,只有在 switch 语句中使用 break 才能跳出 switch 语句,如果某一个 case 语句后边没有 break 语句,代码会继续向下执行,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就比如上面代码就执行了 case 中的语句。
所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。
练习:输入一个1~7的数字,打印对应的星期几
现需求发生变化 :
1. 输入1~5,输出的是“工作日”
2. 输入6~7,输出的是“休息日”
上面的练习中,我们发现可以根据实际需求,来在代码中决定是否使用 break,或者在哪里使用 break。
在使用 switch 语句时,如果 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入 default 。
例如,在前面打印星期几的时候,若 day 的输入不是1~7的值,我们要提示:输入错误,则可以这样:
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序满足实际需求就可以。
不过我们通常是把 default 子句放在最后处理。
完——