C++条件运算符语法详解:三元运算符? : 的使用方法与实例解析
条件运算符的语法是这样的:如果有条件表达式,那么就执行条件为真时的表达式;如果条件不满足,就执行条件为假时的表达式。例如,像 x = ab?a:b 这样的式子。条件运算符能够构成一个表达式。它是 C++中唯一的一个 3 元运算符,并且它们之间是用“?”和“:”隔开的。在上面的例子中,会把 a 和 b 中较小的值赋给 x。该例可替代 if...else 语句:若 ab 成立,则 x = a;若 ab 不成立,则 x = b。条件运算符能构成表达式且有值,而 if...else 语句没有值,所以 if...else 语句不能替代条件运算符。4. 条件运算符表达式的值和测试值没有直接的关联。在该输出语句中,条件运算符表达式的条件若成立,就取“file”这个值;若条件不成立,就取“files”这个值。这里的条件是对两个整型数进行比较,而整个表达式的值是字符串。并且条件运算符是可以嵌套使用的。如果 xy 大于 x 且等于 y 时,值为 equal to,否则,值为 less than。当 xy 大于 x 时,值为 greater than,当 xy 小于 x 时,值为 less than。

条件运算符的嵌套其可读性欠佳。在一个条件运算符的表达式里,如果后面两个表达式的值类型是相同的,并且都为左值,那么这个条件运算符表达式的值就是左值表达式。例如:有 int x = 5;long a,b;此时(x?a:b)=1 是可以的,因为 a 和 b 都是左值;而(x?x:a)=2 则是错误的,原因是 x 和 a 类型不同。编译器将其解释为(long)x 以及 a ,当 x 等于 271 时,a 等于 3 ;这会出现错误,因为 1 不是左值。x?a:b = 1 表示当 x 为 0 时,b 等于 1 ,否则 a 等于 1 。这里的括号是必须的,否则会被看作 x?a:(b = 1) 。在“(x?x:a)=2”里,x 是左值且 a 也是左值,然而 x 与 a 属于不同类型,条件运算符需要对它们进行操作数的隐式转换,让它们变成相同的类型。任何被转换的变量都不是左值。在 C 语言中,条件运算符不能作为左值,所以(x?a:b)=1 这种情况将无法通过编译。赋值语句的作用是把某个常量或变量或表达式的值赋值给另一个变量。
符号是“=”。这里的“=”并非数学意义上的等于,而是赋值操作。等于用“==”来表示。需要注意的是,赋值语句左边的变量在程序的其他地方必须进行声明。已经被赋值的变量被称为左值,这是因为它们出现在赋值语句的左边;而产生值的表达式被称为右值,这是因为它们出现在赋值语句的右边。常数只能作为右值。count 等于 5;total1 和 total2 都等于 0;第一个赋值语句是大家都能理解的。第二个赋值语句意味着把 0 赋予给两个变量。这是因为赋值语句是从右往左进行运算的,也就是从右端开始计算。这样它先让 total2 等于 0;接着让 total1 等于 total2。那么我们这样做可以吗?在 C 语言中,存在两个单目运算符和五个双目运算符。符号具有不同功能,“+”是单目正,“-”是单目负,“*”表示乘法,“/”表示除法,“%”表示取模,“+”还表示加法,“-”还表示减法。下面是一些赋值语句的例子,在赋值运算符右侧的表达式里使用了上述算术运算符,比如:Area 等于 Height 乘以 Width;num 等于 num1 加上 num2 除以 num3 再减去 num4。运算符存在运算顺序的问题,先进行乘除运算,然后再进行加减运算。
单目正和单目负首先进行运算。取模运算符(%)的作用是计算两个整数相除后的余数。比如:a = 7 % 4;最终 a 的结果为 3,这是因为 7 除以 4 的余数是 3。接着有人会问,若想求它们的商该怎么做呢?b = 7 / 4;这样 b 就是它们的商了,其值应该是 1。或许有人会不理解,7 除以 4 应该是 1.75,为何会是 1 呢?这里需说明,两整数相除,所得结果为整数,无小数部分。若要得到小数部分,可写 7.0/4 或 7/4.0,也就是将其中一个数变为非整数。那怎样由一个实数得到它的整数部分呢?这就需用到强制类型转换了。因为 7/4 的值为 1,如果在前面加上 (float) 就表示把结果强制转换成浮点型,这就得到了 1.0。那么思考一下 a=(float) (7/4);最终 a 的结果是 1.0。单目减运算符的作用是取相反值,即若是正值就变为负值,若是负数就变为正值。逻辑运算符会根据表达式的值来返回真值或者假值。在 C 语言中实际上并没有所谓的真值和假值这一说法,只是人们认为非 0 就是真值,而 0 就是假值。符号具有不同的功能,比如“逻辑与”用“||”表示,“逻辑或”用“||”表示,“逻辑非”用“!”表示。例如:有“5!3”这样的表达式;还有“0||-25”这样的;以及“!4”这样的。当这些表达式进行运算时,若其中只要有一个为假,那么整个表达式就为假;只有当所有的表达式都为真时,整个式子才为真。
当进行||运算时,若有一个表达式为真,那么总的值就是真的;只有当所有的表达式都为假时,总的式子才为假。逻辑非(!)运算会将相应的变量数据转换为真或假的值。如果原先的变量数据为假,经过逻辑非运算后就变为真;如果原先的变量数据为真,经过逻辑非运算后就变为假。还有一点很关键,若一个逻辑表达式的后一部分的取值对整个表达式的值没有影响,那么后一部分就不会被运算。比如:a = 2,b = 1;a || b - 1;由于 a = 2 是真值,所以不管 b - 1 是否为真值,整个表达式必定为真值,此时后面的表达式就不会再进行计算了。关系运算符用于对两个表达式进行比较,然后会返回一个真或假的值。其中,“大于”“小于”“大于等于”“小于等于”“等于”“不等于”这些符号都有各自的功能。大家都能理解这些运算符,而主要的问题在于“等于==”和“赋值=”之间的区别。刚开始学习 C 语言的一些人,常常对这两个运算符感到困惑,在一些简单问题上容易出错,而且自己检查时也难以发现。比如看下面的代码:if(Amount = 123)……很多新人会将其理解为当 Amount 等于 123 时会怎样。这行代码的意思是先进行赋值操作,将 Amount 赋值为 123。接着会对这个赋值后的表达式进行判断,看其是否为真值。由于赋值后的结果是 123,123 被视为真值,所以会执行后面的相关操作。
如果要让在 Amount 等于 123 时才运行,那么就应该使用 if(Amount==123)…… 五、自增自减运算符 这是一类比较特殊的运算符,自增运算符++对变量进行操作后,变量的结果会增加 1;自减运算符--对变量进行操作后,变量的结果会减少 1。看这些例子,运算符在前面或后面,对本身的影响是相同的,都是加 1 或减 1。然而,当把它们作为其他表达式的一部分时,两者就有区别了。如果运算符放在变量前面,那么在进行运算之前,变量会先完成自增或者自减的运算;如果运算符放在变量后面,那么自增自减运算会在变量参与表达式的运算之后再进行。这样讲或许不太明晰,请看下面的例子:num1 等于 4;num2 等于 8;a 等于 num1 自增后的值;b 等于 num2 自增前的值;a 等于 num1 自增后的值,整体来看这是一个赋值操作,将 num1 自增后的值赋给 a,由于自增运算符在变量之前,所以 num1 先自增 1 变为 5,接着将 5 赋值给 a,最终 a 的值为 5。这是将 num2++ 的值赋予 b ,由于自增运算符在变量之后,所以先把 num2 赋值给 b ,此时 b 应为 8 ,接着 num2 自增 1 变为 9 。那么若出现这种情况我们该如何处理呢?c 等于 num1 先自增然后加 num2;还是 c 等于 num1 加 num2 然后 num2 自增,这要依据编译器来确定,不同的编译器或许会有不同的结果。
在赋值运算符里,有一类是 C/C++特有的复合赋值运算符。它们其实是一种缩写形式,能让对变量的改变更简洁。比如 Total = Total + 3 这行代码,乍一看好像有问题,似乎这种情况不可能成立。其实还是原先的状况。赋值和等于不同。它的含义是自身的值增加 3,接着把增加后的值赋给自身。为简化,上面的代码可写成:Total 加上 3。复合赋值运算符有以下这些:符号功能为加法赋值即 += ,减法赋值即 -= ,乘法赋值即 *= ,除法赋值即 /= ,模运算赋值即 %= ,左移赋值即 = ,右移赋值即 = ,位逻辑与赋值即 = ,位逻辑或赋值即 |= ,位逻辑异或赋值即 ^= 。上面的十个复合赋值运算符中,后面五个待以后位运算时再进行说明。看了上面的复合赋值运算符后,有人会问,Total=Total+3 与 Total+=3 到底有没有区别呢?答案是有区别的。对于 A=A+1 这种情况,表达式 A 被计算了两次;而对于复合运算符 A+=1 来说,表达式 A 仅计算了一次。一般来说,这种区别对程序运行影响不大。然而,当表达式作为函数返回值时,函数会被调用两次(后续会说明)。并且,如果使用普通赋值运算符,会加大程序开销,导致效率降低。
条件运算符是 C 语言中唯一的三目运算符。它会对第一个表达式进行真/假检测。接着根据检测结果返回另外两个表达式中的一个。具体来说,表达式 1?表达式 2:表达式 3 ,在运算过程中,首先检验第一个表达式,若为真则返回表达式 2 的值,若为假则返回表达式 3 的值。a 等于 b 当 b 大于 0 时;a 等于负 b 当 b 不大于 0 时。