三目运算符"?:"的透彻分析

来源:互联网 发布:织梦cms如何仿站 编辑:程序博客网 时间:2024/05/31 06:21

三目运算符"?:"的透彻分析


    在初学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在实际计算中是不存在的,这里只是为了方便讲解才设置了这三个变量。

    总之,大家看到复杂的"?:"表达式时,不要惊慌,也不要气馁,用心分析,先看清楚表达式的结构,找出到底存在几个?:运算符,然后自己把复杂的表达式逐一拆分,一步步计算结果,最终就会得到正确的结果。
2 0
原创粉丝点击