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

所属分类: 软件编程 / C 语言 阅读数: 77
收藏 0 赞 0 分享

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

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;
}

更多精彩内容其他人还在看

用标准c++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多