第 4 章 运算符与控制语句

        运算符是用于执行特定操作的符号或关键字。C语言中有许多不同类型的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符等。

        表达式是由运算符、操作数和运算符之间的关系组成的。通过组合运算符和操作数,可以创建复杂的表达式来执行各种计算和操作。

        C语言中的控制语句是用来控制程序流程和执行顺序的语句。常用的控制语句包括条件语句(if-else语句),循环语句(for循环、while循环、do-while循环)和跳转语句(break语句、continue语句、goto语句)。


4.1 运算符

4.1.1 算术运算符(Arithmetic Operators)

        C语言中的算术运算符用于执行基本的数学运算。下面是常见的算术运算符:

  • 加法运算符(+):将两个操作数相加,例如 a + b。
  • 减法运算符(-):从第一个操作数中减去第二个操作数,例如 a - b。
  • 乘法运算符(*):将两个操作数相乘,例如 a * b。
  • 除法运算符(/):将第一个操作数除以第二个操作数,例如 a / b。需要注意的是,如果两个操作数都是整数,则结果也将是整数,即会进行截断。如果希望得到浮点数结果,可以将操作数中的至少一个转换为浮点数。
  • 取模运算符(%):计算第一个操作数除以第二个操作数的余数,例如 a % b。这个运算符只能用于整数操作数。

        下图4-1是一些C语言算术运算符的示例:

图4-1  算术运算符示例

        注意:算术运算符具有优先级,可以使用括号来明确指定运算的顺序。此外,还可以使用复合赋值运算符(+=、-=、*=、/=、%=)将算术运算符与赋值运算符结合使用。

4.1.2 关系运算符(Relational Operators)

        关系运算符是C语言中用于比较两个值之间关系的运算符。它们用于比较两个操作数的大小、相等性和不等性,并返回一个布尔值(真或假)。C语言中的关系运算符包括:

  • 相等运算符(==):用于检查两个操作数是否相等。如果相等,则返回真(1),否则返回假(0)。
  • 不等运算符(!=):用于检查两个操作数是否不相等。如果不相等,则返回真(1),否则返回假(0)。
  • 大于运算符(>):用于检查第一个操作数是否大于第二个操作数。如果是,则返回真(1),否则返回假(0)。
  • 小于运算符(<):用于检查第一个操作数是否小于第二个操作数。如果是,则返回真(1),否则返回假(0)。
  • 大于等于运算符(>=):用于检查第一个操作数是否大于等于第二个操作数。如果是,则返回真(1),否则返回假(0)。
  • 小于等于运算符(<=):用于检查第一个操作数是否小于等于第二个操作数。如果是,则返回真(1),否则返回假(0)。

        这些关系运算符通常在条件语句(如if语句和while循环)中使用,用于根据条件的真假来执行不同的代码块。下图4-2是一些关系运算符的示例:

图4-2  关系运算符示例

        在上面的示例中,第一个if语句将输出"a不等于b",因为a和b的值不相等。第二个if语句将输出"a小于等于b",因为a的值小于b的值。

4.1.3 逻辑运算符(Logical Operators)

        在C语言中,逻辑运算符用于在布尔表达式中进行逻辑运算,组合多个条件,并返回一个布尔值。C语言中有三个逻辑运算符:逻辑与(&&),逻辑或(||)和逻辑非(!)。

  • 逻辑与(&&):逻辑与运算符用于判断两个表达式是否都为真。如果两个表达式都为真,则整个表达式的结果为真;如果有一个表达式为假,则整个表达式的结果为假。
  • 逻辑或(||):逻辑或运算符用于判断两个表达式是否至少有一个为真。如果两个表达式至少有一个为真,则整个表达式的结果为真;如果两个表达式都为假,则整个表达式的结果为假。
  • 逻辑非(!):逻辑非运算符用于对一个表达式取反。如果表达式为真,则取反后结果为假;如果表达式为假,则取反后结果为真。

        下图4-3是逻辑运算符的示例:

图4-3  逻辑运算符示例

        逻辑运算符通常用于条件语句(如if语句和while循环)中,用于根据不同的条件执行不同的代码块。它们可以帮助我们进行复杂的条件判断和逻辑控制。

4.1.4 位运算符(Bitwise Operators)

        位运算符是C语言中用于对二进制位进行操作的运算符。它们可以直接操作一个或多个位,而不是整个数值。C语言中的位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移位(<<)和右移位(>>)。

  • 按位与(&):将两个操作数的对应位进行逻辑与运算,只有当两个位都为1时,结果位才为1,否则为0。
  • 按位或(|):将两个操作数的对应位进行逻辑或运算,只要两个位中有一个为1,结果位就为1,否则为0。
  • 按位异或(^):将两个操作数的对应位进行逻辑异或运算,当两个位不同时,结果位为1,否则为0。
  • 按位取反(~):对操作数的每个位进行取反操作,即将0变为1,将1变为0。
  • 左移位(<<):将一个数的所有位向左移动指定的位数,右边空出的位用0填充。
  • 右移位(>>):将一个数的所有位向右移动指定的位数,左边空出的位用符号位填充,符号位是正数时用0填充,负数时用1填充。

        位运算符常用于对二进制位进行掩码、位操作和位运算等操作。它们在处理底层硬件接口、编码和解码、图像处理等方面非常有用。注意:位运算符只能用于整数类型的操作数。

        下图4-4是一些位运算符的示例:

图4-4  位运算符示例

        注意:在示例中使用了无符号整数类型(unsigned int),因为位运算符在有符号整数上的行为是未定义的。

4.1.5 赋值运算符(Assignment Operators)

        C语言中的赋值运算符用于将一个值赋给变量。常见的赋值运算符是等号(=),表示将右侧的值赋给左侧的变量。此外,C语言还提供了一些复合赋值运算符,可以将运算结果与变量的值进行组合,并将结果赋给变量。常见的复合赋值运算符包括:

  • 加法赋值运算符(+=):将右侧的值与变量的当前值相加,并将结果赋给变量。
  • 减法赋值运算符(-=):将变量的当前值减去右侧的值,并将结果赋给变量。
  • 乘法赋值运算符(*=):将右侧的值与变量的当前值相乘,并将结果赋给变量。
  • 除法赋值运算符(/=):将变量的当前值除以右侧的值,并将结果赋给变量。
  • 取模赋值运算符(%=):将变量的当前值除以右侧的值的余数,并将结果赋给变量。
  • 左移赋值运算符(<<=):将变量的当前值左移右侧指定的位数,并将结果赋给变量。
  • 右移赋值运算符(>>=):将变量的当前值右移右侧指定的位数,并将结果赋给变量。

        这些赋值运算符在一定程度上可以简化代码,使变量的赋值和运算在一行内完成。因此较好的使用它们可以提高代码的可读性和效率。

        下图4-5是一些赋值运算符的代码示例:

图4-5  赋值运算符示例

4.1.6 条件运算符(Conditional Operator)

        C语言中的条件运算符是一个三元运算符,也被称为三目运算符。条件运算符根据一个条件的结果来选择执行两个表达式中的一个。如果条件为真,则执行expression1,否则执行expression2。它的语法形式如下:

condition ? expression1 : expression2

        condition是一个条件表达式,可以是任何返回布尔值的表达式。如果条件为真,则表达式expression1将被执行,否则表达式expression2将被执行。

        条件运算符的返回值是根据执行的表达式而定。如果expression1被执行,则返回expression1的值;如果expression2被执行,则返回expression2的值。

        下图4-6是一个使用条件运算符的示例:

图4-6  条件运算符示例

        在这个示例中,我们比较了变量a和b的值。如果a大于b,则将max的值设置为a的值,否则将max的值设置为b的值。

        注意:条件运算符是一个非常简洁和灵活的方式来根据条件选择不同的操作。它在编写简单的条件分支逻辑时经常被使用。

4.1.7 逗号运算符(Comma Operator)

        逗号运算符(,)是C语言中的一个二元运算符,用于将多个表达式组合在一起,并按顺序执行。逗号运算符的作用是先计算其左侧的表达式,然后计算右侧的表达式,并返回右侧表达式的值作为整个表达式的结果。逗号运算符通常用于以下几个场景:

  • 在函数调用中,可以用逗号运算符将多个参数传递给函数。

        下图4-7为在函数调用过程中,逗号运算符的示例。

图4-7  逗号运算符示例1

        上述代码中,先调用add函数将2和3相加,然后将结果赋值给sum变量。

  • 在循环表达式中,可以使用逗号运算符在循环条件中执行多个表达式。

        下图4-8为在循环表达式过程中,逗号运算符的示例。

图4-8  逗号运算符示例2

        上述代码中,逗号运算符用于初始化i和j的值,并在每次循环迭代时分别递增i和递减j。

  • 在表达式中,逗号运算符可以用于多个表达式的执行和计算。

        下图4-9为在表达式过程中,逗号运算符的示例。

图4-9  逗号运算符示例3

        上述代码中,逗号运算符用于递增a和b的值,并将a和b的和赋值给c。

        注意:逗号运算符的优先级是最低的,因此在使用逗号运算符时应注意使用括号来明确优先级。逗号运算符用于将多个表达式组合在一起,并按顺序执行。它在函数调用、循环表达式和表达式中都有一定的应用。使用逗号运算符时要注意优先级,并确保代码的可读性和清晰性。

4.1.8 sizeof运算符

        sizeof运算符是C语言中的一个关键运算符,用于获取指定类型或变量的大小(以字节为单位)。它可以用于获取数组、结构体、指针以及基本数据类型的大小。sizeof运算符的语法格式为:

sizeof(类型) 或 sizeof 变量

        其中,类型可以是任何合法的C数据类型,如int、float、char、数组、结构体等。

        sizeof运算符的返回值是一个无符号整数,表示指定类型或变量的大小。它可以用于在编程中动态地确定数据大小,从而更好地管理内存。

        下图4-10是一些使用sizeof运算符的示例:

图4-10  sizeof运算符示例

        注意:sizeof运算符需要在编译时求值,而不是在运行时。它可以在编译时用来确定数据类型或变量的大小,从而进行适当的内存分配和管理。

        sizeof运算符用于在C语言中获取数据类型或变量的大小,帮助我们更好地管理内存和进行类型转换。


4.2 控制语句

        常用的控制语句包括条件语句(if-else语句),循环语句(for循环、while循环、do-while循环)和跳转语句(break语句、continue语句、goto语句)。下面我们将逐个详细说明这些控制语句的用法和工作原理。

4.2.1 if-else语句

        if-else语句用于根据条件选择性地执行特定的代码块。它的基本语法如下:

if (condition) {

    // if条件为真时执行的代码

} else {

    // if条件为假时执行的代码

}

        当条件(condition)为真时,将执行if代码块中的内容,否则将执行else代码块中的内容。可以根据需要嵌套多个if-else语句。

4.2.2 switch语句

        switch语句用于根据表达式的值选择执行不同的代码块。它的基本语法如下:

switch (expression) {

       case constant1:

           // 当expression的值等于constant1时执行的代码

           break;  // 可选的,用于终止当前case分支

       case constant2:

           // 当expression的值等于constant2时执行的代码

           break;

       ...

       default:

           // 当expression的值与之前的常量都不匹配时执行的代码

           break;

   }

        switch语句会将expression的值与每个case后的常量进行比较。如果匹配到某个case,将执行对应的代码块,然后通过break语句终止当前分支的执行。如果没有匹配到任何case,将执行default代码块中的内容(如果有的话)。

4.2.3 循环语句

        循环语句用于重复执行一段代码,直到满足特定的条件为止。C语言提供了三种类型的循环语句:while循环、do-while循环和for循环。

  • while循环:

        while循环在执行循环体之前先检查条件是否为真,如果为真,则执行循环体中的代码,然后再次检查条件。如果条件为假,则跳过循环体,继续执行后面的代码。它的基本语法如下:

while (condition) {

    // 循环体中的代码

}
  • do-while循环:

        do-while循环先执行一次循环体中的代码,然后再检查条件是否为真。如果为真,则继续执行循环体,然后再次检查条件。如果条件为假,则跳出循环,继续执行后面的代码。它的基本语法如下:

do {

    // 循环体中的代码

} while (condition);
  • for循环:

        for循环是一种在已知循环次数的情况下使用的循环结构。它由三个部分组成:初始化、条件和迭代。在每次循环开始时,首先执行初始化部分,然后检查条件是否为真。如果为真,则执行循环体中的代码,然后执行迭代部分。循环继续,直到条件为假为止。它的基本语法如下:

for (initialization; condition; iteration) {

    // 循环体中的代码

}

        初始化部分用于初始化循环变量,条件部分用于判断循环是否继续,迭代部分用于更新循环变量的值。这些控制语句在C语言中非常常用,可以根据需要灵活地使用它们来控制程序的流程和执行顺序。

4.2.4 跳转语句

        跳转语句用于在程序中跳转到指定的位置。常用的跳转语句有break语句、continue语句和goto语句。跳转语句用于改变程序的执行流程,常用的跳转语句有break、continue和goto。

  • break语句:用于在循环或switch语句中提前结束循环或跳出switch语句。
  • continue语句:用于跳过当前循环中剩余的代码,进入下一次循环。
  • goto语句:用于无条件跳转到程序中的标记位置,一般不推荐使用,因为过多的goto语句会导致程序难以理解和维护。
  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值