
3.5 状态处理
状态数据一般用于存放某种状态。一般状态包括真或假两种状态。在编程中,默认使用1表示真,使用0表示假。在C语言中,提供了4种对状态数据进行处理的运算符。本节将详细讲解状态处理要使用到的运算符。
3.5.1 条件运算符

条件运算符(?:)属于三目运算符,拥有3个操作数,并根据操作数1的状态选择运算值。如果操作数1的状态为真,则运算值为操作数2;如果操作数1的状态为假,则运算值为操作数3。条件运算符的语法如图3.28所示。

图3.28 条件运算符的语法
【示例3-42】使用条件运算符。
程序如下:

运行程序,输出以下内容:

在上面程序中,由于操作数1为表达式10>7,而该表达式的状态为真,所以该程序的运行结果为操作数2,即10。
3.5.2 逻辑运算符

有时我们会看到这样的场景:一个小队的队长发布一条任务后,队员们会挨个儿进行回复,如果全部队员都回复了“是”,这个小队才会出发执行该任务,但只要有一个队员回复“否”,就会暂停执行该任务。在这里就涉及多次判断是否符合条件,并要进行多次回复的情况,如图3.29所示。

图3.29 多次判断是否符合条件
在C语言中,提供了3种逻辑运算符,即逻辑与、逻辑或及逻辑非。逻辑运算符可以用于判断是否符合条件,然后进行逻辑运算。
1. 逻辑与运算符
逻辑与运算符(&&)属于二目运算符,拥有两个操作数。
逻辑与运算符的语法如下。

其中,操作数1与操作数2都属于条件表达式。如果这两个操作数的状态都为真,则运算值为1(表示真),否则运算值为0(表示假)。
【示例3-43】使用逻辑与运算符。
程序如下:

运行程序,输出以下内容:

在上面程序中,操作数1为表达式10>7,而该表达式的状态为真;操作数2为表达式8>7,而该表达式的状态为真。所以,表达式10>7&&8>7的运算结果为1(表示真)。
2. 逻辑或运算符
逻辑或运算符(||)属于二目运算符,拥有两个操作数。
逻辑或运算符的语法如下:

其中,操作数1与操作数2都属于条件表达式。如果这两个操作数中至少有一个操作数的状态为真,则运算值为1(表示真)。如果这两个操作数的状态都为假,则运算值为0(表示假)。
【示例3-44】使用逻辑或运算符运算。
程序如下:

运行程序,输出以下内容:

在上面程序中,操作数1为表达式7>7,而该表达式的状态为假;操作数2为表达式10>7,而该表达式的状态为真。所以,表达式7>7||10>7的运算结果1(表示真)。
3. 逻辑非运算符
逻辑非运算符“!”属于一目运算符,拥有一个操作数。
逻辑非运算符的语法如下:

其中,操作数属于条件表达式。如果这个操作数的状态为真,则运算值为0(表示假)。如果这个操作数的状态为假,则运算值为1(表示真)。
【示例3-45】使用逻辑非运算符。
程序如下:

运行程序,输出以下内容:

在上面程序中,由于操作数1为表达式8<10,而该表达式的状态为真。所以,表达式8<10的运算结果为0(表示假)。在书写!(8<10)时,必须要加小括号,否则计算机会认为是!8。
注意:将使用逻辑运算符连接起来的表达式称为逻辑表达式。逻辑运算的真值表如表3.7所示。
表3.7 逻辑运算的真值表

4. 短路原则
在C语言中,提供了短路原则,以减少逻辑与运算符、逻辑或运算符的运算量。短路原则是指如果通过第1个操作数就能得出运算结果,计算机就不会再对第2个操作数的状态真假进行判断,而会直接得出运算结果。
例如,在逻辑或运算中,如果操作数1的状态为真,则计算机就不会再去判断操作数2的状态真假,而会执行短路原则,直接得出运算结果为1(表示真),如图3.30所示。

图3.30 短路原则
在生活中,我们也常常会使用到短路原则。例如,当我们考驾照(机动车驾驶证)时,如果不满足年龄必须大于或等于18岁的这个条件,则无法参加驾照考试。
5. 逻辑运算优先级
在表达式中,如果同时出现多个逻辑运算符,一定要注意逻辑运算符优先级。逻辑运算符优先级如图3.31所示。逻辑非运算符(!)为右结合的,逻辑与运算符(&&)、逻辑或运算符(||)为左结合的。

图3.31 逻辑运算符优先级