744 字
4 分钟
--
条件运算和逗号运算
2023-10-12

条件运算和逗号运算#

条件运算符(三目运算符)#

基本用法#

a = (a > 10) ? a++ : a--;

由于一口气能处理条件以及两个不同的结果,所以条件运算符是三目运算符,虽然看起来很抽象不好理解,但其实是有据可循的:

用自然语言来描述的话,从左到右依次是变量的名称,括号内是我们要判定的东西,问号则是条件运算符,接下来我们单独理解后面的这一串:

a++ : a--;

如果前面的判定为真,也就是a>10,就执行冒号左边的内容,也就是a++,如果a不大于10,则执行冒号右边的内容,也就是a—。

复杂示例#

当然,冒号分隔两个情况,两边的情况可以执行很多条件,比如这样:

我们假定一个场景,角色拥有生命值,防御力和法术防御力,敌方的攻击会根据伤害的类型来给角色造成伤害。

int a0 = 10, a1 = 15; // a0就是物理防御,a1就是法术防御
int hp = 100;
int atk = 10;
char c[10];
// 假定这里有一个函数用来决定怪物的攻击
c = (c == 'yes') ? a0--, hp -= a0 - atk : a1--, hp -= atk * (a1 * 0.01), (int)hp;

怪物在攻击角色之后首先降低角色的防御值,角色收到的伤害则是这样判定:物理防御是一比一抵扣,法术防御则是按照百分比抵扣,(int)hp则是转换类型消除小数点后的部分让hp来保持是整数。判定字符c是不是yes就可以实现这样的逻辑,是很实用的东西啦,如果写成一大堆if的话可是很麻烦的事情,而且对内存的占据也比较大。

等价写法#

当然,如果还是不好理解的话,我们不妨这样:

count = (count > 20) ? count++ : count--;

这个式子其实和下面的这个式子表示的是一个意思:

if(count > 20) {
count++;
} else {
count--;
}

在程序简单的时候,可以使用条件运算符来减少运算量,但是程序复杂的话,还是老老实实写if不容易出错一点。

优先级#

条件运算符的优先级比赋值运算高,但是比所有运算都低。

逗号运算符#

基本概念#

逗号运算符用来连接两个表达式,以右边的表达式的值作为它的结果。比如:

int a;
a = (1 + 2, 3 + 4); // 这样会报错,但是要求括号内的值,会得出7

常见应用#

通常,逗号运算符常用于if中,用于放多个运算,像是这样:

for(i = 0, j = 10; i < 10; i++)

由于=优先级高,所以在循环的开始就变成了既i=0,并且j=10。

条件运算和逗号运算
https://vilstia.org/posts/学习笔记/c/条件运算和逗号运算/
作者
琴泠 - Lumina Qin
发布于
2023-10-12
许可协议
CC BY-NC-SA 4.0