`
xuning2516
  • 浏览: 8037 次
  • 性别: Icon_minigender_1
  • 来自: 江西
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

C++ 条件运算符 ? :求公共类型

 
阅读更多

这段时间看C++标准库,看到有一个求公共类型的实用函数common_type<>;其实现是如下:

template<typename T1,typename T2>
struct common_type<T1,T2>
{
    typedef decltype(true?declval<T1>(),declval<T2>()) type;
}
刚开始还觉得奇怪,条件永远为true,不就是直接计算T1吗,想当然的以为产生公共类型不就是T1的类型吗?后然通过一个实例上机实验才发现不是这么回事。于是找到关于条件运算符的说明;我们知道条件运算符?:是C++中唯一的一个三目运算符。用法
expression ? expression : expression

下面是msdn对条件运算符的解释。from:http://msdn.microsoft.com/en-us/library/e4213hs1(v=vs.110).aspx

The conditional operator (? :) is a ternary operator (it takes three operands). The conditional operator works as follows:

  • The first operand is implicitly converted tobool. It is evaluated and all side effects are completed before continuing.

    第一个操作数自动转换成bool类型值。

  • If the first operand evaluates totrue(1), the second operand is evaluated.

  • If the first operand evaluates tofalse(0), the third operand is evaluated.

The result of the conditional operator is the result of whichever operand is evaluated — the second or the third. Only one of the last two operands is evaluated in a conditional expression.

Conditional expressions have right-to-left associativity(从右至左结合性). The first operand must be of integral or pointer type. The following rules apply to the second and third expressions:

  • If both expressions are of the same type, the result is of that type.

  • If both expressions are of arithmetic or enumeration types, the usual arithmetic conversions (covered inArithmetic Conversions) are performed to convert them to a common type. //如果两个表达式类型不相同,但是都是算术或者是枚举类型。那么算术转换将他们转换成共同类型。

  • If both expressions are of pointer types or if one is a pointer type and the other is a constant expression that evaluates to 0, pointer conversions are performed to convert them to a common type. //指针类型转换

  • If both expressions are of reference types, reference conversions are performed to convert them to a common type. //引用类型转换

  • If both expressions are of type void, the common type is type void. //void 最低级的类型

  • If both expressions are of a given class type, the common type is that class type. //类类型的基本转换是他的基类的类型。

Any combinations of second and third operands not in the preceding list are illegal. The type of the result is the common type, and it is an l-value if both the second and third operands are of the same type and both are l-values.

通过上面的说明可以看到common_type是通过隐式类型转换来实现的。看来对一些基本概念的掌握还是不牢固啊。

分享到:
评论

相关推荐

    C++面向对象程序设计标准教案.pdf

    - 条件运算符:? :是C++中唯一的三元运算符,用于基于条件表达式选择两个值中的一个。 C++数组和指针: - 数组:用于存储一系列相同类型的数据。例如,int cj[30]定义了一个包含30个整数的数组。 - 指针:是一种...

    yunsuanfu.zip_zip

    首先,我们要了解C++中的基本运算符类型: 1. **算术运算符**:包括加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。它们用于执行基本的数学运算。例如,`5 + 3`的结果是8,`10 / 2`的结果是5。需要注意的...

    visual C++一些练习题参考题

    8. **运算符重载**:C++允许通过`operator`关键字重载运算符,使其能用于自定义类型的对象。 9. **运算符重载的实例**:运算符+在整型和浮点型变量中的不同应用是运算符重载的例子。 10. **成员函数重载运算符**:...

    c++基础知识总结概括

    6. **条件运算符**: `(条件) ? 表达式1 : 表达式2`,例如: ```cpp int x = (a &gt; b) ? a : b; // 如果a&gt;b,则x=a;否则x=b ``` #### 八、控制结构 1. **条件语句**: - `if`: 根据条件执行代码块。 - `if-else...

    C++比较不错的总结知识

    18. **禁止重载的运算符**:包括成员指针访问运算符(.*),域运算符(::),sizeof运算符,条件运算符(?:),成员访问符(.)。 19. **运算符重载方式**:普通函数、友元函数和类成员函数。 20. **流运算符重载*...

    大学C++复习题.pdf

    :`条件运算符,`*`成员指针运算符,以及`sizeof()`运算符。 10. **只能用类重载的运算符**:`=`, `()`, `[]`, `*`这四个运算符只能通过类的成员函数来重载。 11. **格式宽度控制**:C++提供了`width(int val)`、`...

    c++学习代码和c++API

    1. 变量和数据类型:理解各种基本数据类型如int、float、char,以及它们的存储需求和使用场景。 2. 运算符:掌握基本运算符,如算术运算符、比较运算符、逻辑运算符和位运算符。 3. 控制结构:了解条件语句(if-else...

    C++函数表.docx

    还有条件运算符(`?:`),如`max=(a&gt;b)?a:b`,根据条件选择返回`a`或`b`。指针运算符(`*`和`&`)用于获取变量的地址和解引用。此外,C++还支持运算符重载,使得类的对象可以直接进行加减乘除等操作。 【C++类】 ...

    计算机二级C++公共基础知识总结及历年试题.pdf

    1. C++基础知识:C++作为一种高级编程语言,其基础知识包括变量、数据类型、运算符、控制结构(如条件语句和循环)、函数、数组、指针和引用等。这些都是程序员编写程序时必须掌握的基本概念。 2. 面向对象编程...

    C++优秀PPT课件C++优秀PPT课件C++优秀PPT课件

    3. 数据类型:包括基本数据类型(整型、浮点型、字符型等)、复合数据类型(数组、结构体、枚举)及其使用方法。 4. 变量与常量:理解变量的声明、初始化和作用域,以及常量的定义与使用。 5. 运算符:讲解各种...

    C++程序设计电子讲义C++程序设计电子讲义

    - 数据类型:包括基本类型(如int、float、char等)、指针类型和自定义类型(类)。 - 运算符:包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。 - 流程控制:if-else、switch-case、for、while和do-...

    C++经典面试题全集

    :(条件运算符)和.(成员访问)。 19. 运算符重载的三种方式是:普通函数、友元函数和类成员函数。 20. 流运算符(和&gt;&gt;)通常通过友元函数重载,因为成员函数重载需要第一个参数是当前类的对象。 21. 赋值...

    c++面试大全

    17. **不允许重载的运算符**:成员指针访问运算符(.*)、域运算符(::)、sizeof运算符、条件运算符(?:)和成员访问运算符(.)。 18. **运算符重载的方式**:通过普通函数、友元函数和类成员函数实现。 19. **...

    谭浩强的C++源代码

    - 数据类型:C++支持基本数据类型(如int、char、float、double等),以及自定义的数据类型(如struct和class)。 - 变量:存储数据的内存位置,需要先声明后使用。 - 运算符:包括算术运算符(+、-、*、/、%)、...

    C++经典趣味编程源码(三个版本txt、word、pdf)

    - 变量与数据类型:C++支持基本的数据类型如int、float、char,以及结构体、枚举等复杂类型。 - 运算符:包括算术运算符、关系运算符、逻辑运算符等,以及C++特有的重载运算符。 - 控制流:如if条件语句、switch...

    电子科技大学c++课件

    1. 变量与数据类型:C++支持基本数据类型(如int、float、char)以及复杂数据类型(如结构体、枚举)。变量声明时需要指定数据类型,并进行初始化。 2. 运算符:包括算术运算符、比较运算符、逻辑运算符、赋值运算符...

    清华大学 C++教程

    1. 变量与数据类型:C++支持基本数据类型(如int、float、char)以及复杂数据类型(如结构体、联合体)。变量是存储数据的容器,理解它们的声明、初始化和使用至关重要。 2. 运算符:C++包含丰富的运算符,包括算术...

Global site tag (gtag.js) - Google Analytics