C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。
仔细思考可以发现:生活中的大量问题都可以通过这三种方法来解决
我们使用 if 、switch 实现选择(分支)结构,使用 for、 while、do while 实现循环结构。
1.if 语句
1.1if
if的语法结构:
if(表达式)
语句一;
在C语言中,0表示假,非0表示真
1.2 else
else的语法结构:
if(表达式)
语句一;
else
语句二;
1.3分支中包含多条语句
在if和else语句中默认只控制一条语句;
若要控制多条,可以采用大括号。
所以为了方便,直接加上大括号
if(表达式)
{
语句一;
}
else
{
语句二;
}
1.4嵌套if
嵌套在else中,当代码判断没有一定顺序时
在if else语句中,else可以与另一个if连用,构成多重判断。
比如:输入一个整数,判断其是0、正数还是负数
写法一:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
if (n == 0)
printf("输入的是0\n");
else {
if (n > 0)
printf("输入的是正数\n");
else
printf("输入的是负数\n");
}
}
写法二:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
if (n == 0)
printf("输入的是0\n");
else if (n > 0)
printf("输入的是正数\n");
else
printf("输入的是负数\n");
}
}
嵌套在if中,当代码判断有一定顺序时
比如:输入一个整数,如果它是正数,再判断是奇数还是偶数,并输出;如果它是非正数,则输出非正数。
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
if (n > 0) {
if (n % 2 == 0)
printf("n是偶数");
else
printf("n是奇数");
}
else
printf("n是非正数");
}
嵌套中的判断范围可以不考虑嵌套外的范围
if(n>0)
printf("大于0");
else if(n<200)
printf("大于0且小于200");
else
printf("大于等于200")
1.5悬空else问题
在多个if和else中,else总是和最近的if匹配
#include <stdio.h>
int main() {
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
if (a > 0)
if (b > 0)
printf("haha");
else
printf("hehe");//其自动与第二个if对齐
}
此代码原理:只有a成立,才判断时if 还是else
*而此代码更好的书写格式是:
#include <stdio.h>
int main() {
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
if (a > 0)
{
if (b > 0)
printf("haha");
else
printf("hehe");//其自动与第二个if对齐
}
}
**小提示:适量数量的空格,提升代码美感。要养成良好的代码习惯!
2.关系操作符
2.1 有哪些
C语言用于比较的表达式,称为“关系表达式” (relational expression),里面使用的运算符就称为"关系运算符”(relational operator) ,主要有下面6个。
•> 大于运算符
•< 小于运算符
•>= 大于等于运算符
•<= 小于等于运算符
•== 相等运算符
•!= 不相等运算符
*关系表达式通常返回0或1,表示真假。
C语言中,0表示假,所有非零值表示真。比如,20>12返回1。12>2日返回0。
关系表达式常用于 if 或 while 结构。
2.2 需要避免的错误
2.2.1“=”赋值,“==”相等
注意两个的区分!
如果一个变量和一个常量比较相等,建议将常量放在==的左边
#include <stdio.h>
int main() {
int a = 5;
if (7 == a)
printf("haha\n");
}
改变的一定是操作符的左边,常量无法改变,故放在左边可以防止错误。
2.2.2 多个关系操作符不能连用
int a = 10;
int b = 6;
int c = 9;
if(a<b<c)
printf("haha");
运行结果是:haha
运行原理:a先与b比较--a>b--结果为假0
0再与c比较--0<c--成立
正确写法:
int a = 10;
int b = 6;
int c = 9;
if(a<b && b<c)//&& 是并且的意思
printf("haha");
3.条件操作符
条件操作符又叫三目操作符,需要接受三个数。
格式:exp1 ?exp2 :exp3
操作原理:
表达式1真-----表达式2计算,表达式3不算,表达式2的结果是整个表达式的结果
表达式1假-----表达式2不算,表达式3计算,表达式3的结果是整个表达式的结果
#include <stdio.h>
int main() {
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
if (a > 5)
printf("b=3");
else
printf("b=-3");
}
#include <stdio.h>
int main() {
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
b = (a > 5 ? 3 : -3);
printf("%d", b);
}
//与条件判断的运行结果相同,所以又叫条件操作符
使用条件表达式来判断两个值的最大值
#include <stdio.h>
int main() {
int a = 0;
int b = 0;
int m = 0;
scanf("%d %d", &a, &b);
m=(a > b ? a : b);
printf("%d", m);
return 0;
}
4.逻辑操作符 && || !
! 逻辑取反运算符(改变单个表达式的真假)
&& 与运算符,并且
|| 或运算符,或者
4.1 逻辑取反运算符 !
a | !a |
非0 | 0 |
0 | 1 |
*真打印,假不打印
#include <stdio.h>
int main(){
int aim = 0;
if (!aim)
printf("haha\n");
return 0;
}
运行结果为:haha
4.2 与操作符 &&
双目操作符
规则:两端都真为真。有假则假。
3到5月是春季
#include <stdio.h>
int main() {
int a = 0;
scanf("%d", &a);
if (a >= 3 && a <= 5)
printf("春季");
return 0;
}
4.3 或操作符 ||
规则:一端为真即为真,两端都为假才为假
#include <stdio.h>
int main() {
int a = 0;
scanf("%d", &a);
if ( a==1 || a==2 || a==12)
printf("冬季");
}
4.4练习(判断是否为闰年):
规则:能被4整除但不能被100整除,或者能被400整除
#include <stdio.h>
int main() {
int a = 0;
scanf("%d", &a);
if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0)
printf("闰年");
else
printf("平年");
return 0;
}
4.5短路
C语言逻辑运算符还有一个特点:它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式不满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
与(一假全假)
#include <stdio.h>
int main() {
int a = 0;
int b = 10;
int c = 6;
int i = a++ && ++b && c++;
//a先使用再++
//a先使用a=0,决定了后面不在运算
//a后++ a=1,决定了a自身最后的结果
printf("%d\n%d\n%d", a, b, c);
return 0;
}
结果:a=1,b=10,c=6
如果a=1
#include <stdio.h>
int main() {
int a = 1;
int b = 10;
int c = 6;
int i = a++ && ++b && c++;
//a先使用再++
//a先使用a=1,决定了后面继续运算
//a后++决定了a自身最后的结果,a=2
printf("%d\n%d\n%d", a, b, c);
return 0;
}
结果:a=2,b=11.c=7
或(一真全真)
#include <stdio.h>
int main() {
int a = 1;
int b = 10;
int c = 6;
int i = a++ || ++b || c++;
//或只要有一个为真即可
//a=1为真,故后面直接运算即可
printf("%d\n%d\n%d", a, b, c);
return 0;
}
结果:a = 2, b = 11.c = 7
5.switch语句
除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。(分支结构:if 、switch)
switch 语句用于判断条件有多个结果的情况。它把多重的else if 改成更易用、可读性更好的形式。
--switch 后的 expression 必须是整型表达式
浮点数不行,字符可以,整型可以(字符属于整型家族)
--case 后的值,必须是整形常量表达式
#include <stdio.h>
int main(){
int a=0;
int n=9;
scanf("%d",&a);
switch(s)//整型表达式
{
case 1:
printf...
case 1+2://正确,只要是整型常量表达式即可
case n://错误,因为n是变量
printf...
}
}
5.1 if语句和switch语句的比较
//求被3整除的余数是几
//if语句
#include <stdio.h>
int main() {
int a = 0;
scanf("%d", &a);
if (a % 3 == 0)
printf("余数是0\n");
else if (a % 3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
//switch语句
#include <stdio.h>
int main() {
int a = 0;
scanf("%d", &a);
switch (a % 3)
{
case 0://入口
printf("余数是0\n");
break;//出口
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
5.2switch语句中的break
case是入口,break是出口
break在特殊情况下可以省略,且更方便。
根据实际需求添加break!!
#include <stdio.h>
int main() {
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
}
return 0;
}
5.3 Switch语句中的default
当所有case都无法匹配时,输入default
#include <stdio.h>
int main() {
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("输入错误");
break;
}
return 0;
}