《C和指针》(Kenneth Reek)精读——第四章:语句

第四章:语句

  • [4.1 空语句](#4.1 空语句)
  • [4.2 表达式语句](#4.2 表达式语句)
  • [4.3 代码块](#4.3 代码块)
  • [4.4 if 语句](#4.4 if 语句)
  • [4.5 while 语句](#4.5 while 语句)
    • [4.5.1 break和continue](#4.5.1 break和continue)
  • [4.6 for语句](#4.6 for语句)
  • [4.7 do 语句](#4.7 do 语句)
  • [4.8 switch 语句](#4.8 switch 语句)
    • [4.8.1 switch 中的break](#4.8.1 switch 中的break)
    • [4.8.2 switch 中的default](#4.8.2 switch 中的default)
  • [4.9 goto语句](#4.9 goto语句)

4.1 空语句


空语句通常由一个分号(;)表示,不执行任何操作

c 复制代码
; // 这是一个空语句

4.2 表达式语句


表达式后面加上一个分号,就可以把表达式转变为语句

c 复制代码
x = y + 3;
ch = getchar();

4.3 代码块


4.4 if 语句


c 复制代码
//if语法
if(expression){
	statement
}
else{
	statement
}

在C的if语句和其他语言的if语句中,只存在一个差别。C并不具备布尔类型,而是用整型来代替。0为假,非0为真。

悬空else问题:else和谁匹配问题。在Python中,由于依赖缩进来定义代码块,因此通常不会出现悬空else问题。但是,在其他语言(如C、C++、Java等)中,如果不正确地使用花括号,就可能出现这个问题。

c 复制代码
if (condition1)
    if (condition2)
        statement1;
else
    statement2;

在这个例子中,else与哪个if匹配是不明确的。根据语言的语法规则,else将与最近的未匹配的if语句匹配 ,即if (condition2)。为了避免这种问题,应该始终确保使用花括号来明确界定代码块,尤其是在嵌套的if-else语句中。上述代码应该这样写:

c 复制代码
if (condition1) {
    if (condition2) {
        statement1;
    } else {
        statement2;
    }
}

在这个修改后的版本中,else明确地与if (condition2)匹配,使得代码的逻辑更加清晰。

4.5 while 语句

c 复制代码
//while语法
while (expr) {  
    // 要重复执行的代码块  
}

4.5.1 break和continue


  • while循环中可以使用break 语句,用于永久终止循环。
  • while循环中也可以使用continue 语句,它用于永久终止当前的那次循环。

4.6 for语句


c 复制代码
//for语法
for(expression1; expression2 ; expression3 ){
	statement;
}

for语句的执行过程几乎和下面的while 语句一模一样:

c 复制代码
expression1 ;
while ( expression2 ) {
	statement;
	expression3 ;
}

当然forwhile两者也有差异,差异表现在 continue 语句

for 循环中,通常有一个初始化部分、一个条件检查部分、一个循环体和一个调整(或迭代)部分。这些部分在 for 语句的声明中就已经定义好了。当在循环体内遇到 continue 语句时,程序会跳过当前迭代剩余的代码,并直接跳到调整部分,然后开始下一次迭代的条件检查。

c 复制代码
for (int i = 0; i < 10; i++) {
    if (i == 5) {
        continue; // 当 i 等于 5 时,跳过当前迭代剩余的部分
    }
    // 循环体的其余部分
    printf("%d\n", i);
}

在这个例子中,当 i 等于 5 时,continue 语句会跳过 printf 调用,然后 i 会递增(这是 for 循环的调整部分),接着检查 i < 10 是否为真,以决定是否开始下一次迭代。

而在 while 循环中,循环体通常是一个代码块,它包含了需要检查的条件和所有需要执行的语句。没有像 for 循环那样的显式调整部分;循环的迭代通常通过在循环体内部修改条件变量来实现。因此,当在 while 循环的循环体内部遇到 continue 语句时,它会跳过当前迭代剩余的代码,并立即回到 while 语句的条件检查。如果条件仍然为真,循环将重新开始;如果条件为假,循环将终止。

c 复制代码
int i = 0;
while (i < 10) {
    
    if (i == 5) {
        continue; // 当 i 等于 5 时,跳过当前迭代剩余的部分
    }
    // 循环体的其余部分
    i++; // 这可以看作是调整部分,但在 while 循环中它是循环体的一部分
    printf("%d\n", i);
}

4.7 do 语句


c 复制代码
do{
statement;
}while (expression);

do-while至少执行一次

4.8 switch 语句

c 复制代码
switch (expression) {  
    case constant-expression1:  
        // 代码块1  
        break;  
    case constant-expression2:  
        // 代码块2  
        break;  
    // 可以有更多的 case 语句  
    default:  
        // 默认执行的代码块  
        break;  
}
  • constant-expression1:常量整型值表达式,不能是变量

4.8.1 switch 中的break


switch语句的执行过程。首先是计算 expression 的值,然后执行流转到语句列表中其case标签值与expression的值匹配的语句。从这条语句起,直到语句列表的结束也就是switch语句的底部,它们之间所有的语句均被执行。

如果遇到break就直接执行到switch底部

4.8.2 switch 中的default


default写在任何一个case标签可以出现的位置。当switch 表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是,它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句。

4.9 goto语句


不建议使用goto语句

相关推荐
快乐就好ya31 分钟前
Java多线程
java·开发语言
CS_GaoMing1 小时前
Centos7 JDK 多版本管理与 Maven 构建问题和注意!
java·开发语言·maven·centos7·java多版本
2401_858120532 小时前
Spring Boot框架下的大学生就业招聘平台
java·开发语言
转调2 小时前
每日一练:地下城游戏
开发语言·c++·算法·leetcode
Java探秘者2 小时前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
2303_812044463 小时前
Bean,看到P188没看了与maven
java·开发语言
秋夫人3 小时前
idea 同一个项目不同模块如何设置不同的jdk版本
java·开发语言·intellij-idea
不穿格子衬衫3 小时前
常用排序算法(下)
c语言·开发语言·数据结构·算法·排序算法·八大排序
萧鼎3 小时前
Python调试技巧:高效定位与修复问题
服务器·开发语言·python
wdxylb3 小时前
使用C++的OpenSSL 库实现 AES 加密和解密文件
开发语言·c++·算法