前言
第一次尝试在这里总结一些知识,构建框架,可能会有一些不足之处,在此真诚希望各位能多多指教。
在接触分支与循环之前,我们需要熟悉并掌握逻辑表达式、关系运算符和判等运算符。在这里只做一些简单介绍
逻辑运算符
关系运算符
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。
判等运算符
1. == (等于)ps:单独的“=”的意义是赋值,不要与“==”搞混了
2.!=(不等于)
接下来让我们把目光转向目录,可看到,我们将要了解的有三种语句:一,分支(选择)语句 二,循环语句 三,退出循环语句(跳转语句)。
分支部分
if语句
if语句的运作过程如同一个人走一条形如“Y”的路,走到分叉点要去选择一个方向继续前进。它允许程序通过表达式的值从两种选项中选择一种。基本语法如下
if(表达式)
{
语句
}
C语言对可以出现在if语句内部的语句类型没有限制,if语句内部可以嵌套多个if语句
举个用if语句判断两个数字数量关系的质子
#include <stdio.h>
int main()
{
int a = 0, b = 0;
scanf("%d %d",&a,&b);
if(a >= b)
{
if(a > b)// if语句里可套多个“if语句”
{
printf("a大于b");
}
else// if语句中可以有else子句
{
printf("a等于b");
}
}
else
{
printf("a小于b");
}
return 0;
}
上面质子进行了展开,让我们隐约看到了else子句,级联式if子句,接下来让我们轻轻地向它扔个二向箔,使它转变为二维平面,方便“查看”
else子句
else子句的基本语法如下
if(表达式)
{
语句;//不要忘记给语句加分号!
}
else//如果if表达式为假,则执行else后边的语句
{
语句;
}
注意!由于if语句可以嵌套任何层,可能会发生嵌套混乱!参考下例
if(i > j)
if(i > k)
{max = i;}
else
{max = k;}
else
if(j > k)
{max = j;}
else
{max = k;}
显然,这样写的if~else语句看起来比较混乱,层次不清。解决上述问题的方法是:把每个else同它所匹配的if语句对齐。
if(i > j)
if(i > k)
{max = i;}
else
{max = k;}
else
if(j > k)
{max = j;}
else
{max = k;}
这样看着就舒服多了,后续程序也会更容易进行修改
级联式if子句
级联式if语句非常实用,它可以让程序通过判定一系列条件,一旦其中某一个条件为真就立刻停止。
参考下例:用级联式if语句判定n与0之间的数量关系
if(n < 0)
{
printf("n < 0");
}
else
if(n == 0)
{
printf("n = 0");//此处为数学意义上的=
}
else
{
printf("n > 0");
}
简单来说,级联式语句是if~else语句中,有另一个if语句作为else语句的子句,而这“另一个if语句”又有另另外一条if语句作为它自己的else子句(可以这样不断类推、延申)
“悬空else”的问题
圣喵大佬对这个问题讲的非常生动详细,大家可以从这个入口进去看看
https://blog.csdn.net/m0_66769266/article/details/124145982
switch语句
switch语句可以视作级联式if语句的替代,其基本语法如下
switch(控制表达式)
{
case 常量表达式1:
语句
break://没有break的话就会执行下一条语句
case 常量表达式2:
语句
break:
...
default:
语句n
break;//最后一个break可以不要,建议写,养个好习惯
}
看一下它的组成部分
控制表达式:switch后边必须跟着由圆括号括起来的整型表达式。C语言把字符当成整数来处理, 因此在switch语句中可以对字符进行判定。但是,这不适用于浮点数和字符串。
分支标号:每个分支的开头都有一个标号,格式如下:
case 常量表达式:
常量表达式:很像普通的表达式,只是不能包含变量和函数调用。因此,5是常量表达式,5+10也 是常量表达式,但n + 10不是常量表达式(除非n 是表示常量的宏)。分支标号中常 量表达式的 值必须是整数(字符也可以)。
语句:每个分支标号的后边可以跟任意数量的语句,并且不需要用花括号把这些语句括起来。每 组语句的最后一条通常是break语句(其中break语句会导致程序"跳"出switch语句,继续执行switch后面的语句)
C语言对switch中的分支没有要求,特别是default语句不一定要放置在最后。
注意:switch 语句不要求一定有default分支。如果 default不存在,而且控制表达式的值和任何一个分支标号都不匹配的话,控制会直接传给 switch语句后面的语句。
举个例子
#include <stdio.h>
int main()
{
int choice;
printf("请选择一个数字:\n");
printf("1. 篮球\n");
printf("2. 足球\n");
printf("3. 乒乓球\n");
scanf("%d", &choice);
switch(choice) {
case 1:
printf("您选择了篮球。\n");
break;
case 2:
printf("您选择了足球。\n");
break;
case 3:
printf("您选择了乒乓球。\n");
break;
default:
printf("您输入的不是一个有效的选择。\n");
}
return 0;
}
该程序首先提示用户选择一个数字,
然后使用 Switch 语句根据用户的选择输出相应的文本。
如果用户未输入有效的选择,则输出默认消息。
多个分支标号可以放置在同一组语句的前面:
switch (grade)
{
case 4:
case 3:
case 2:
case 1:
printf("Passing");
break;
case 0:
printf("Failing");
break;
default:
printf("Illegal grade");
break;
}
循环部分
我们先简要了解一下while、do~while和for循环之间的区别
while循环在循环体执行之前测试控制表达式,do~while循环在循环体执行之后测试控制表达式,for语句适合那些递增或递减计数变量的循环。
while循环语句
C语言中,while循环用于重复执行一段代码,直到满足指定的条件才会停止循环。基本语法如下
while(控制表达式)
{
语句 //花括号之间的部分称为循环体
}
其中“控制表达式”是一个逻辑表达式,当这个表达式的结果为真时,循环体中的代码会执行,否则循环会终止。
下面是一个示例程序,演示了如何使用 while 循环输出从 1 到 10 的所有整数:
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d\n", i);
i++;
}
return 0;
}
该程序使用 while 循环来迭代变量 i 的值。在每次循环中,程序会首先检查 i 是否小于等于 10,如果是,就输出 i 的当前值,然后将 i 的值加 1。直到 i 大于 10 时,循环会终止,程序结束执行。
do while循环语句
C语言中,使用do while循环的基本语法如下:
do
{
语句//循环体
}while(控制表达式);
do while循环会先执行循环体中的代码,再判断循环条件是否成立。如果循环条件成立,则继续执行循环体中的代码;如果循环条件不成立,则跳出循环。
举个例子,可以使用do while循环计算1到10的整数和,代码如下:
#include <stdio.h>
int main()
{
int sum = 0;
int i = 1;
do
{
sum += i;
i++;
} while (i <= 10);
printf("1到10的整数和为:%d\n", sum);
return 0;
}
在上面的代码中,先初始化sum和i的值,然后进入do while循环,循环体中先执行sum += i和i++操作,然后再检查循环条件i <= 10是否成立,如果成立,则继续执行循环体中的代码,反之则跳出循环,并输出结果。
for 循环语句
for循环的基本语法如下
for(初始化表达式; 循环条件; 更新表达式)
{
语句//循环体
}
其中,初始化表达式在循环开始前只执行一次,一般用于初始化循环变量;循环条件是一个布尔表达式,如果为真则继续执行循环体,否则跳出循环;更新表达式在每次循环结束后执行一次,一般用于更新循环变量的值。
下面是一个计算1到10所有整数之和的例子:
#include <stdio.h>
int main()
{
int sum = 0;
for (int i = 1; i <= 10; i++)
{
sum += i;
}
printf("1到10的整数之和为:%d\n", sum);
return 0;
}
//其运行结果为 1到10的整数之和为:55
可以看到,for循环可以方便地完成类似于计数、遍历等任务。
退出循环的语句
break语句
break语句用于在循环中提前结束循环。当代码执行到break语句时,循环中的代码将立即停止执行,并跳出循环体,继续执行下面的代码。
break语句通常与if语句一起使用,以便在满足某些条件时跳出循环。例如:
#include <stdio.h>
int main()
{
int num;
while (1)
{
scanf("%d", &num);
if (num == -1)
{
break;
}
printf("%d\n", num);
}
return 0;
}
在这个例子中,代码将不断地从用户输入中读取数字,直到用户输入数字-1为止。当用户输入-1时,if语句将检测到这个条件,break语句将被执行,循环将立即退出。
除了在while循环中使用,break语句还可以在for循环、do-while循环等其他类型的循环中使用,用法类似
continue语句
continue语句可以用于循环语句(如for、while、do-while)中,用于跳过本次循环中剩余的语句,直接进入下一次循环。
当程序执行到continue语句时,会跳过本次循环中位于continue后面的语句,直接进入下一次循环。
以下是一个简单的for循环示例,演示了如何在循环中使用continue语句:
for(int i=0; i<10; i++)
{
if(i == 5)
{
continue;
}
printf("%d ", i);
}
以上代码的输出结果将是:0 1 2 3 4 6 7 8 9
在第5次循环时,由于i等于5,执行了continue语句,直接跳过了本次循环中位于continue后面的printf语句,进入下一次循环。因此,输出结果中不包含数字5。
注意:在使用continue语句时,需要保证其位于某个循环体内,否则会出现语法错误。同时,过多地使用continue语句也会降低代码的可读性和可维护性,要小心一点用。
goto语句
在C语言中,goto语句可以用于循环内部的跳转,通常用于程序中断或错误处理。下面是几个示例:
示例1:跳转到循环体顶部
int i = 0;
loop:
语句//跳到了这里
if (i < 10)
{
语句// 循环体
i++;
goto loop; // 跳转到循环体顶部
}
示例2:跳转到循环体结束处
int i = 0;
if (i < 10)
{
语句// 循环体
i++;
goto end;
}
end://跳到了这里
语句
示例三:在循环中跳出多层循环
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (j == 5)
{
goto end; // 跳出两层循环
}
}
}
end://跳到了这里
语句
注意:虽然goto语句可以在某些情况下简化代码,但过多的使用会让程序难以维护和理解。因此,应该尽量避免在循环中使用goto语句,而是使用其他结构化控制语句,如break和continue来实现类似的功能。