
if 语句,显而易见是如果的意思,通过判断真假来确认语句是否执行,其语法形式为:
if ( 表达式 )
 语句表达式内语句为真,则语句执行,表达式内语句为假,则语句不执行,会直接跳过该语句 在C语言中,0表示为假,非0表示为真

如果判断一个事物的正反面写两个 if 语句,就太麻烦了,这里就需要用到 if…else… 语句了 例如:输入⼀个年龄,>= 18岁就输出:成年,否则就输出:未成年
#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age>=18)
 printf("成年\n");
 else
 printf("未成年\n");
 return 0;
}在 if 和 else 语句中都默认只控制一条语句,还是上面的例子,如果想要既打出"成年",又想打出"可以谈恋爱了",那就需要用大括号将两个 printf 输出语句括起来
#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
 {
 printf("成年了\n");
 printf("可以谈恋爱了\n");
 }
 return 0;
}那如果在 if 语句中嵌套 if 语句呢,这叫做嵌套 if ,但是如果连着多个 if 语句嵌套的话,会显得代码特别复杂不易理解,而且花括号多了,检查代码时也很难一一对应不遗漏,所以可以使用 else if ,就省去了嵌套的麻烦 例如:输入⼀个整数,判断输入的整数是0,还是正数或者负数
#include <stdio.h>
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;
}这里注意,如果 else 语句前有多个 if ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配,相当于前面的 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;
}用于比较的操作符称为关系表达式
• > 大于运算符 • < 小于运算符 • >= 大于等于运算符 • <= 小于等于运算符 • == 相等运算符 • != 不相等运算符
关系表达式通常返回 0 或 1 ,表示真假,比如, 20 > 12 返回 1 , 12 > 20 返回 0 注意不要把相等运算符 == 和赋值运算符 = 弄混
要避免多个运算符连用,举个例子: i < j < k 这是个合法表达,但不能保证 j 在 i 和 k 之间,这是因为关系运算符是从左往右运算,即 (i < j) < k 所以应改为这种写法 i < j && j < k
条件操作符也叫三目操作符,需要接受三个操作数,其语法形式为:
exp1 ? exp2 : exp3如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果
逻辑运算符用于逻辑的判断
• ! :逻辑取反运算符(改变单个表达式的真假) • && :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假) • || :逻辑或运算符,就是或者的意思(两侧至少有⼀个表达式为真,则为真,否则为假)
C语言的逻辑运算有个特点,就是优先对左侧的表达式求值,再对表达式右边的值求值 如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为短路
switch 语句用于实现分支结构,在循环结构中相当于 else if 使用 switch 能够更好解读代码,其语法形式为:
switch (expression)
 {
 case value1: statement
 case value2: statement
 default: statement
}语句会依次执行 case 分支,如果找不到对应的分支语句,就执行 default 语句 注意: • switch 后的 expression 必须是整型表达式 • case 后的值,必须是整形常量表达式
举个例子:输入任意⼀个整数值,计算除3之后的余数
#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch(n%3)
 {
 case 0:
 printf("整除,余数为0\n"); 
 break;
 case 1:
 printf("余数是1\n"); 
 break;
 case 2:
 printf("余数是2\n"); 
 break;
 default:
 printf("输入错误");
 }
 return 0;
}注意: • case 和后边的数字之间必须有空格 • 每⼀个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句,否则会继续执行别的语句,就达不到我们想要的分支效果了 • default 在语句中没有顺序要求,通常把 default 放最后更符合逻辑
while 语句也是一种常用的循环语句,while 语句的语法结构和 if 语句非常相似 举个例子:
#include <stdio.h>
int main()
{
 while(1)
 printf("hehe\n"); //while后边的条件满⾜,死循环的打印hehe
 return 0;
}首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语 句,语句执行完后再继续判断,是否进行下⼀次判断

for 循环在循环结构中是最常使用的,其语法形式为:
for(表达式1; 表达式2; 表达式3)
 语句;//如果循环体想包含更多的语句,可以加上⼤括号表达式1 用于循环变量的初始化 表达式2 用于循环结束条件的判断 表达式3 用于循环变量的调整
举个例子:计算1~100之间3的倍数的数字之和
#include <stdio.h>
int main()
{
 int i = 0;
 int sum = 0;
 for(i=1; i<=100; i++)
 {
 if(i % 3 == 0)
 sum += i;
 }
 printf("%d\n", sum);
 return 0;
}首先执行表达式1:初始化循环变量,接下来就是执行表达式2:判断,表达式2的结果如果==0,则循环结束 表达式2的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表达式3:调整循环 然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续

整个过程中表达式1:初始化只被执行过一次
do-while 语句在循环结构中使用的最少,其语法形式为:
do
 语句;
while(表达式);举个例子:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
 int i = 1;
 do
 {
 printf("%d ", i);
 i = i + 1;
 }while(i<=10);
 
 return 0;
}首先执行 do 里的语句,然后判断表达式 判断表达式的结果是!=0,则继续循环,执行循环语句;判断表达式的结果 == 0,则循环结束

在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。C语言中 提供了 break 和 continue 两个关键字,就是应用到循环中的。
• break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行 • continue 的作用是跳过本次循环中 continue 后边的代码, for 循环中直接跳到循环调整部分,while 循环直接跳到循环判断部分
goto 语句可以实现在同⼀个函数内跳转到设置好的标号处 举个例子:
#include <stdio.h>
int main()
{
 printf("hehe\n");
 goto next;
 printf("haha\n");
 
next:
 printf("跳过了haha的打印\n"); 
 return 0;
}goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建 议是能不用尽量不去使用;但是 goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出 使用 goto 就非常的方便了 比如本来 for 循环想提前退出得使用 break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套 就得使用3个 break 才能跳出循环,所以在这种情况下我们使用 goto 语句就会更加的快捷