三目运算符"?:"的透彻分析
在初学C语言以及类似的语言时,大家可能对于三目运算符"?:"的使用及意义比较混乱,下面对这个运算符进行详细的解释。
之所以称之为三目运算符是因为这个运算符有三个操作数,即
int num = (i == 0) ? 1 : 2;
这里?:运算符包含了三个操作数,即i == 0、1和2。这句话的含义就是当i等于0为真,则将1赋给num,否则将2赋给num。抽象来说,就是"?"前面的值(不论是一个数还是一个表达式的结果)为真时,"?:"运算符的结果就是":"前面的值,否则结果就是后面的值。
"?:"运算符其实就是if else语句的简化版,这个运算符使得判断语句十分简单,应用场合比较多。例如上面的例子其实完全可以写为:
int num;
if (0 == i)
{
num = 1;
}
else
{
num = 2;
}
这样来看的话就十分清晰易懂。通常"?:"运算符还有更为复杂的应用形式,下面对其进行简单介绍。
int num = 0;
int i = 1;
int j = 2;
int k = 3;
num = ((i > j) ? i : j) ? ((j > k) ? j : k) : ((k > 5) ? k : 5);
printf("num = %d.\n", num);
上面程序的打印结果是:3。大家乍一看肯定感觉十分复杂,感觉分析起来无从下手,其实只要理清楚思路就十分简单了,不过需要注意的是,这种形式并不是很常见,有时候最多出现嵌套2个"?:"运算符,很少出现3个。不过这里举例复杂的目的是,如果这么复杂的都可以理解,其他的自然不在话下。那么下面我们把这个程序转换成if-else的形式就十分清晰易懂了。
int num = 0;
int i = 1;
int j = 2;
int k = 3;
int temp1 = 0;
int temp2 = 0;
int temp3 = 0;
// num = ((i > j) ? i : j) ? ((j > k) ? j : k) : ((k > 5) ? k : 5);
// (i > j) ? i : j的if else形式
if (i > j)
{
temp1 = i;
}
else
{
temp1 = j;
}
// 如果(i > j) ? i : j的结果,即temp1为真(非零),则
// 计算(j > k) ? j : k,并将其结果temp2赋给num;
// 如果(i > j) ? i : j的结果,即temp1为假(零),则
// 计算(k > 5) ? k : 5,并将其结果temp3赋给num;
if (temp1)
{
// (j > k) ? j : k的if else形式
if (j > k)
{
temp2 = j;
}
else
{
temp2 = k;
}
num = temp2;
}
else
{
// (k > 5) ? k : 5的if else形式
if (k > 5)
{
temp3 = k;
}
else
{
temp3 = 5;
}
num = temp3;
}
printf("num = %d.\n", num);
将?:运算符的运算式转化为if else形式后,就大致能够明白这个运算式的含义了。当然,上面例子中的temp1、temp2、temp3在实际计算中是不存在的,这里只是为了方便讲解才设置了这三个变量。
总之,大家看到复杂的"?:"表达式时,不要惊慌,也不要气馁,用心分析,先看清楚表达式的结构,找出到底存在几个?:运算符,然后自己把复杂的表达式逐一拆分,一步步计算结果,最终就会得到正确的结果。