目录

一、C语言的语句有哪些

1.1 空语句

1.2 表达式语句

1.3 函数调用语句

1.4 复合语句

1.5 控制语句

二、分支语句

1.1 if语句

1.1.1 将主线划分为2大块的普通if语句

1.1.2 将主线划分为2块以上的嵌套if语句

1.1.3 else悬空问题

1.1.4 if语句的代码可读性

1.2 switch语句(不常用)

三、循环语句

3.1 while循环

3.2 do_while循环(不常用)

3.3 for循环

3.4 循环嵌套的练习

四、转向语句

4.1 break语句在循环语句中的应用

4.1.1 break在while循环中的举例

4.1.2 break在do_while循环中的举例

4.1.3 break在for循环中的举例

4.2 continue语句在循环语句中的应用

4.2.1 continue在while循环中的举例

4.1.2 continue在do_while循环中的举例

4.1.3 continue在for循环中的举例

4.3 goto语句

4.4 return语句


一、C语言的语句有哪些

C语言代码由一条条语句构成,每条语句的结束标志是封号。C语言的语句有5种,分别是空语句表达式语句函数调用语句复合语句控制语句

1.1 空语句

概念:封号前面什么都不写的一条语句称为空语句。

用法:这里需要一条语句,但不希望这条语句其任何作用。

int main(){;//空语句return 0;}

1.2 表达式语句

问:编程语言中表达式可以由什么构成?

答:一个操作数、一个操作数和一个运算符、两个操作数和一个操作符,多个操作数和多个操作符,例如:1,i++,1+2,1+2*3,c=a+b

概念:封号前面是表达式的一条语句称为表达式语句。

int main(){int i = 0;int a = 0, b = 0, c = 0;1;//表达式语句i++;//表达式语句1 + 2;//表达式语句1 + 2 * 3;//表达式语句c = a + b;表达式语句return 0;}

1.3 函数调用语句

概念:封号前面是函数调用的一条语句称为函数调用语句。

用法:在函数中需要利用具有某功能的函数时使用。

int Add(int a, int b){return a + b;}int main(){int a = 1;int b = 2;int sum = Add(a, b);//自定义函数的函数调用printf("%d\n", sum);//库函数的函数调用return 0;}

1.4 复合语句

概念:用{ }包裹起来的所有语句整体被称为复合语句。

补充:一个{ }被称为一个代码块。

//在屏幕上打印用*组成的金字塔,行高列宽均为4int main()//复合语句1{for (int i = 0; i < 4; i++)//复合语句2{int j = 0;//空白for (j = 0; j < 4 - 1 - i; j++)//复合语句3{printf(" ");}//星星for (j = 0; j <= i; j++)//复合语句4{printf("*");}printf("\n");}return 0;}

1.5 控制语句

概念:控制语句共9种,用于控制程序的执行流程,实现顺序、选择和循环结构

① 选择语句:if_else语句、switch语句

② 循环语句:while语句、do_while语句、for语句

③ 转向语句:break语句、continue语句、goto语句、return语句

二、分支语句

1.1 if语句

1.1.1 将主线划分为2大块的普通if语句

>单个if

if(表达式)一条语句;//if默认只能控制一条语句,想同时控制多条语句时也可以写成:if (表达式){语句1;语句2;...}

>if_else

if (表达式)一条语句;else一条语句;//if和else默认只能控制一条语句,想同时控制多条语句时也可以写成:if (表达式){语句1;语句2;...}else{语句1;语句2;...}

1.1.2 将主线划分为2块以上的嵌套if语句

//第一种写法:if嵌套ifif(表达式1){if(表达式2){语句1;语句2;...}}else{语句1;语句2;...}//第二种写法:else嵌套if的普通写法if(表达式1){语句1;语句2;...}else{if(表达式2){语句1;语句2;...}}//第三种写法:else if写法if(表达式1){语句1;语句2;...}else if(表达式2){语句1;语句2;...}else{语句1;语句2;...}

上面的三种写法中,表达式1的作用是将整个主线划分为2大块,表达式2的作用:如果带表达式2的if语句写在第一个if后的{ }中表示将表达式1成立的一大块继续划分为2块(if后面嵌套if可以理解成条件中包含条件),如果带表达式2的if语句写在else后面的{ }中或写成else if形式,表示将表达式1不成立的一大块继续划分为2块(else后面嵌套if可以直接理解成将整个主线划分为多个并列的分支,也可以理解成将表达式1不成立的部分继续划分为更小的部分,else if在读代码时读成,否则表达式…不成立的部分如果满足表达式…就执行…否则就执行…

总之,if语句的嵌套,其实就是将分支单元划分为更小的分支单元。if中直接嵌套if表示条件的条件,eles中嵌套if,普通写法表示将上一个条件不满足的部分划分为更小的分支单元,而else if写法常用于题目中有明显想将主线划分为多个并列分支单元的意向。

//else嵌套if两种写法的比较://题目:判断整型n是正数、负数还是0//写法一:int main(){int n = 0;scanf("%d", &n);//判断if(n > 0){printf("%d是正数\n", n);}else//else部分就只剩下<=0的情况了{//理解成剩余部分再划分的写法if(n  0){printf("%d是正数\n", n);}else if(n < 0)//理解成主线划分的多个并列的分支写法{printf("%d是负数\n", n);}else{printf("%d是0\n", n);}return 0;}

1.1.3 else悬空问题

问题起源:在写C语言题目或读别人的代码时,由于代码可读性差导致我们无法准确判断if语句中的else到底是跟着哪个if,因而造成了else悬空问题。

解决方法:代码从上往下读,只要遇到else就根据else总是与最近的未配对的if配对原则进行匹配即可。

int main() {int a = 1;int b = 2;if ( a == 0 )if ( b == 2 )printf("123\n");elseprintf("abc\n");return 0;}//这段代码在屏幕上什么都不会打印//是因为该代码中的else与第二个if配对,而不是与第一个if配对

1.1.4 if语句的代码可读性

//示例1:比较变量a和常数3是否相等,相等就在屏幕上打印heheint main(){int a = 0;if (a = 3)//手误写法,最终会造成表达逻辑有误{printf("hehe\n");}}//启示://变量和常数比较是否相等时,把常数写在左边,变量写在右边//这样当我们粗心把==写成=时编译器会报警告,而不是继续编译//示例2:虽节省空间,但可读性差int main(){int a = 0;if (a == 0){printf("hehe\n");}else{printf("haha\n");}//启示://不能省的空间不要省,无论控制1条还是控制多条语句都写上代码块//示例3:可读性好int main(){int arr[] = { 1,2,3 };int sz = sizeof(arr) / sizeof(arr[0]);//定义数字后立即计算数组大小int i = 0;for (i = 0; i < sz; i++){if (2 == arr[i])//比较常量和变量是否相等时,常量在左,变量在右{printf("hehe");//不管控制几条语句,都采用代码块括起来}}return 0;}

1.2 switch语句(不常用)

switch语句可实现多分支,但使用的条件苛刻,只有在特定情况下才会主动使用switch语句。

switch语句的语法形式:

switch(表达式){case 值1:语句1;语句2;...break;case 值2:语句1;语句2;...break;case 值3:语句1;语句2;...break;...default:语句1;语句2;...break;}

苛刻条件:

①switch后面的表达式必须是整型表达式

②case后面的值必须是整型常量表达式(字符是特殊的整型类型,枚举类型也可以)

需要理解:

①case和default相当于每个分支的入口,而break相当于每个分支的出口,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,直到遇到break语句或者来到switch语句的结尾才会跳出switch语句。

②当所有case都不满足时,才执行default分支,default分支可依据具体情况选择写还是不写

③每个switch语句只能有一个default分支

④case和default分支没有顺序要求,但dafault通常写在最后面

⑤switch语句的最后一个分支可以不写break,但最好是写上

三、循环语句

3.1 while循环

特点:循环条件总是比循环体多执行一次

补充:想要一直循环可以将表达式写成恒真的形式,例如:while(1)

运行过程:先判断while后面的表达式是否为真,如果为真就执行一次循环体的内容,执行完后,程序又会来到while循环的第一行,继续判断while后面的表达式是否为真;如果为假,程序将跳过整个循环体的代码块,不会执行循环体的任何内容。

while(表达式)一条语句;//while循环和if语句一样默认只能控制一条语句,想同时控制多条语句时也可以写成:while(表达式){语句1;语句2;...}

3.2 do_while循环(不常用)

特点:循环体至少执行一次

注意:do_while中while后面的封号别忘记写了

运行过程:先执行do后面代码块内的所有内容,执行完后来到while所在行,判断while后面的表达式是否为真,如果为真将继续执行一次循环体内的所有内容;如果为假,将跳出循环来到while(表达式)的下一行。

do{语句1;语句2;...}while(表达式);

3.3 for循环

表达式1:循环变量初始化部分

表达式2:循环是否继续的条件

表达式3:循环变量的调整

特点:表达式1至执行一次,表达式2总是比循环体多执行一次

注意:①表达式之间是用封号隔开的 ②表达式1、2、3均可以省略,但并不建议省略 ③for循环的循环条件所含的循环变量不一定要写在表达式3的位置,例如,《国王发金币问题》[NOIP2015]金币_牛客题霸_牛客网 (nowcoder.com)

运行过程:先执行表达式1,再就表达式2的真假判断是否要执行循环体的内容,如果表达式2为真,那么将执行一次循环体内的内容,执行完后,程序将回到for循环的第一行,执行表达式3,执行完后,再次执行表达式2,判断是否要继续执行循环体的内容;如果表达式2为假,程序将跳过整个循环体的代码块,不会执行循环体的任何内容,包括表达式3。

for (表达式1;表达式2;表达式3){语句1;语句2;...}
//《国王发金币问题》int main(){int k = 0;scanf("%d", &k);int day = 0;//已计算的天数int sum = 0;//发放的金币总和for(int money = 1; day < k; money++){for(int i = 0; i < money; i++){sum += money;day++;if(day == k){break;}}}//输出printf("%d\n", sum);return 0;}

3.4 循环嵌套的练习

//【打印100~200之间的素数】int main(){ int i = 0; //循环产⽣100~200的数字 for(i=101; i<=200; i += 2) { int flag = 1;//假设每次得到的i是素数 int j = 0; for(j=2; j<=(int)sqrt((double)i); j++) { if(i % j == 0) { flag = 0; break; } } // if(flag == 1) { printf("%d ", i); } } return 0;}

四、转向语句

4.1 break语句在循环语句中的应用

关键字break的作用:只要break在循环体中被执行,就会直接跳出最近的一层循环

4.1.1 break在while循环中的举例

4.1.2 break在do_while循环中的举例

4.1.3 break在for循环中的举例

4.2 continue语句在循环语句中的应用

关键字continue的作用:跳过本次循环体中后面的代码

4.2.1 continue在while循环中的举例

4.1.2 continue在do_while循环中的举例

4.1.3 continue在for循环中的举例

4.3 goto语句

C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号,goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。

goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。

4.4 return语句

① return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执⾏表达式,再返回表达式 的结果。

② return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。

③ return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。

④ return语句执⾏后,函数就彻底返回,后边的代码不再执⾏,如下方图片代码。

⑤ 如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误。


本篇已完结…