C++编程中逗号运算符和条件运算符的使用方法讲解

逗号运算符:,
允许对两个语句进行分组,其中有一个是预期的。

expression , expression

备注
逗号运算符具有从左向右的关联性。 由逗号分隔的两个表达式将从左向右进行计算。 始终计算左操作数,并且在计算右操作数之前将完成所有副作用。
在某些上下文(如函数参数列表)中,逗号可用作分隔符。 不要将该逗号用作分隔符与将其用作运算符的情况混淆;这两种用法完全不同。
考虑表达式

e1 , e2

该表达式的类型和值是 e2 的类型和值;e1 的计算结果将被丢弃。 如果右操作数是左值,则结果为左值。
在通常将逗号用作分隔符的方案中(例如,在函数或聚合初始值设定项的实参中),逗号运算符及其操作数必须包含在括号中。 例如:

func_one( x, y + 2, z );
func_two( (x--, y + 2), z );

在上面的对 func_one 的函数调用中,会传递以逗号分隔的三个参数:x、y + 2 和 z。 在对 func_two 的函数调用中,圆括号强制编译器将第一个逗号解释为顺序计算运算符。 此函数调用将两个参数传递给 func_two。 第一个参数是顺序计算运算 (x--, y + 2) 的结果,具有表达式 y + 2 的值和类型;第二个参数为 z。
示例

 // cpp_comma_operator.cpp
#include <stdio.h>
int main () {
 int i = 10, b = 20, c= 30;
 i = b, c;
 printf("%i\n", i);

 i = (b, c);
 printf("%i\n", i);
}
20
30

条件运算符:? :
语法

expression ? expression : expression

备注
条件运算符 (? :) 是一个三元运算符(采用三个操作数)。条件运算符按以下方式运行:
第一个操作数隐式转换为 bool。计算该操作数,并在继续前完成所有副作用。

  • 如果第一个操作数的计算结果为 true (1),则计算第二个操作数。
  • 如果第一个操作数的计算结果为 false (0),则计算第三个操作数。
  • 条件运算符的结果是操作数(无论是第二个还是第三个)的计算结果。只有最后两个操作数之一在条件表达式中计算。
  • 条件表达式具有从右到左的关联性。第一个操作数必须是整数或指针类型。以下规则适用于第二个和第三个操作数:
  • 如果两个操作数是相同的类型,则结果也是该类型。
  • 如果两个操作数都是算术或枚举类型,则执行常用算术转换(在算术转换中有述)来将它们转换为通用类型。
  • 如果两个操作数都是指针类型,或者一个是指针类型,另一个是计算结果为 0 的常量表达式,则执行指针转换来将它们转换为通用类型。
  • 如果两个操作数都是引用类型,则执行引用转换来将它们转换为通用类型。
  • 如果两个操作数都是 void 类型,则通用类型是 void 类型。
  • 如果两个操作数是相同的用户定义类型,则通用类型也是该类型。
  • 如果操作数是不同的类型,而且至少有一个操作数是用户定义类型,则使用语言规则来确定通用类型。(请参阅下面的警告。)

前面列表中没有的第二个和第三个操作数的任意组合都是非法的。结果的类型是通用类型,如果第二个和第三个操作数是同一类型且都是左值,则结果为左值。

System_CAPS_warning警告
如果第二个和第三个操作数的类型不相同,则会按 C++ 标准中的指定调用复杂类型转换规则。这些转换可能会导致意外行为,包括构造和析构临时对象。为此,我们强烈建议:(1) 避免将用户定义的类型用作带条件运算符的操作数;(2) 如果确实要使用用户定义的类型,务必将每个操作数显式转换为通用类型。

// expre_Expressions_with_the_Conditional_Operator.cpp
// compile with: /EHsc
// Demonstrate conditional operator
#include <iostream>
using namespace std;
int main() {
 int i = 1, j = 2;
 cout << ( i > j ? i : j ) << " is greater." << endl;
}
(0)

相关推荐

  • C++编程中的或||、与&&、非!逻辑运算符基本用法整理

    逻辑或运算符:||   语法 logical-or-expression || logical-and-expression 备注 如果任一操作数或两个操作数为 true,则逻辑"或"运算符 (||) 返回布尔值 true:否则返回 false.操作数在计算之前隐式转换为类型 bool,结果的类型为 bool.逻辑"或"具有从左向右的关联性. 逻辑"或"运算符的操作数不需要是同一类型,但是它们必须是整型或指针类型.操作数通常为关系或相等表达式.

  • 详解C++编程中的sizeof运算符与typeid运算符

    sizeof 运算符 产生与 char 类型的大小有关的操作数大小. 语法 sizeof unary-expression sizeof ( type-name ) 备注 sizeof 运算符的结果为 size_t 类型,它是包含文件 STDDEF.H 中定义的整数类型.利用此运算符,你可以避免在程序中指定依赖于计算机的数据大小. sizeof 的操作数可以是下列项之一: 类型名称.若要将 sizeof 用于类型名称,则该名称必须用括号括起. 一个表达式.当用于表达式时,无论是否使用括号都可指定

  • 详解C++中的函数调用和下标以及成员访问运算符的重载

    函数调用 使用括号调用的函数调用运算符是二元运算符. 语法 primary-expression ( expression-list ) 备注 在此上下文中,primary-expression 为第一个操作数,并且 expression-list(可能为参数的空列表)为第二个操作数.函数调用运算符用于需要大量参数的操作.这之所以有效,是因为 expression-list 是列表而非单一操作数.函数调用运算符必须是非静态成员函数. 函数调用运算符在重载时不会修改函数的调用方式:相反,它会在运算

  • 详解C++语言中的加法运算符与赋值运算符的用法

    加法运算符:+ 和 - 语法 expression + expression expression – expression 备注 相加运算符为: 加 (+) 减 (–) 这些二进制运算符具有从左至右的关联性. 相加运算符采用算术或指针类型的操作数.加法 (+) 运算符的结果是操作数之和.减法 (–) 运算符的结果是操作数之差.如果一个操作数是指针或两个操作数都是指针,则它们必须是指向对象的指针,而不是指向函数的指针.如果两个操作数都是指针,则结果没有意义,除非它们是指向同一数组中的对象的指针.

  • 详解C++中new运算符和delete运算符的使用

    C++ 支持使用 new 和 delete 运算符动态分配和释放对象.这些运算符为来自称为"自由存储"的池中的对象分配内存. new 运算符调用特殊函数 operator new,delete 运算符调用特殊函数 operator delete. 在 Visual C++ .NET 2002 中,标准 C++ 库中的 new 功能将支持 C++ 标准中指定的行为,如果内存分配失败,则会引发 std::bad_alloc 异常. 如果内存分配失败,C 运行库的 new 函数也将引发 st

  • 详解C++中const_cast与reinterpret_cast运算符的用法

    const_cast 运算符 从类中移除 const.volatile 和 __unaligned 特性. 语法 const_cast < type-id > ( expression ) 备注 指向任何对象类型的指针或指向数据成员的指针可显式转换为完全相同的类型(const.volatile 和 __unaligned 限定符除外).对于指针和引用,结果将引用原始对象.对于指向数据成员的指针,结果将引用与指向数据成员的原始(未强制转换)的指针相同的成员.根据引用对象的类型,通过生成的指针.引

  • 详解C++编程中一元运算符的重载

    可重载的一元运算符如下: !(逻辑"非") &(取址) ~(二进制反码) *(取消指针引用) +(一元加) -(一元求反) ++(递增) --(递减) 转换运算符 后缀递增和递减运算符(++ 和 ––)在递增和递减中单独处理,下面会讲到. 以下规则适用于所有其他一元运算符.若要将一元运算符函数声明为非静态成员,则必须用以下形式声明它: ret-type operator op () 其中 ret-type 是返回类型,op 是上表中列出的运算符之一. 若要将一元运算符函数声明为

  • C++编程中删除运算符与相等运算符的使用解析

    delete删除运算符 释放内存块. 语法 [::] delete cast-expression [::] delete [ ] cast-expression 备注 cast-expression 参数必须是指向以前分配给使用 new 运算符创建的对象的内存块的指针. delete 运算符的结果类型为 void,因此它不返回值.例如: CDialog* MyDialog = new CDialog; // use MyDialog delete MyDialog; 对指向不使用 new 分配

  • 简单了解C++语言中的二元运算符和赋值运算符

    二元运算符 下表显示可重载的运算符的列表. 可重新定义的二进制运算符 运算符 名称 , 逗号 != 不相等 % 取模 %= 取模/赋值 & 按位"与" && 逻辑"与" &= 按位"与"/赋值 * 乘法 *= 乘法/赋值 + 添加 += 加法/赋值 – 减法 –= 减法/赋值 < 小于 << 左移 <<= 左移/赋值 <= 小于或等于 = 赋值 == 相等 > 大于 >

  • C++中的运算符和运算符优先级总结

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C++ 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本文将逐一介绍算术运算符.关系运算符.逻辑运算符.位运算符.赋值运算符和其他运算符. 算术运算符 下表显示了 C++ 支持的所有算术运算符. 假设变量 A 的值为 10,变量 B 的值为 20,则: 运算符 描述 实例 + 把两个操作数相加 A + B 将得到 30 - 从第一个操作数中减去第二个操作数 A - B 将

  • 深入解析C++编程中的运算符重载

    C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.例如: class complex { public: complex(double r=0.0,double I=0.0){real=r;imag=I;} void display(); private: double real; double imag; }; complex a(10,20),b(5,8); "a+b"运算如何实现?这时候我们需要自己编写程序来说明"

  • 深入解析C++编程中__alignof 与__uuidof运算符的使用

    __alignof 运算符 C++11 引入 alignof 运算符,该运算符返回指定类型的对齐方式(以字节为单位).为实现最大的可移植性,应使用 alignof 运算符,而不是特定于 Microsoft 的 __alignof 运算符. 返回一个 size_t 类型的值,该值是类型的对齐要求. 语法 __alignof( type ) 备注 例如: Expression 值 __alignof( char ) 1 __alignof( short ) 2 __alignof( int ) 4

  • 讲解C++编程中Address-of运算符&的作用及用法

    语法 & cast-expression 备注 一元 address-of 运算符 (&) 采用其操作数的地址.address-of 运算符的操作数可以是函数指示符,也可以是指定不是位域且不使用 register 储存类说明符声明的对象的左值. address-of 运算符仅适用于具有基本.结构.类或在文件范围级别声明的联合类型的变量,或仅适用于下标数组引用.在这些表达式中,可在 address-of 表达式中添加或提取不包括 address-of 运算符的常数表达式. 当应用于函数或左值

随机推荐