1.条件运算符“? :”
是C++中唯一的三目运算符,其形式为: 表达式1 ?表达式2 :表达式3
运算方式为:先计算表达式1的值,如果其值为非0(真), 则表达式2的值就是整个表达式的最终结果;否则表达式3的值就是整个表达式的值。
表达式1是bool类型,表达式2、3的类型可以不同,条件表达式的最终类型为 2 和 3 中较高的类型。 例如:用条件运算符定义求两个数a和b的最大值
#include<iostream>
using namespace std;
int main()
{
int a = 3;
int b = 4;
int max = a > b ? a : b;
cout << "第一种表达方式结果max=" << max << endl;
int max2 = ((a > b) ? a : b);
cout << "第二种表达方式结果max2=" << max2 << endl;
system("pause");
return 0;
}
输出结果截图
可见,即使不加()对运算顺序做区分,三目运算符也遵循以下规则
1.2-条件运算符的结合性是自右向左
- a>b?a:c>d?c:d 相当于: a>b?a:(c>d?c:d)
1.3-条件运算符的优先级别高于赋值运算符,低于关系运算符和算术运算符
- 例如:a>b?a-b:b-a 相当于: (a>b)?(a-b):(b-a)
c
2.逗号运算符
- 格式:表达式1,表达式2,…,表达式n
- 求解顺序及结果: 先求解表达式1,再求解表达式2,最后求解表达式n的值 最终结果为表达式n的值
例如: d1,d2,d3,d4 此处,d1、d2、d3、d4都是一个表达式
- 整个表达式的值由最后一个表达式的值d4决定
- 计算顺序是从左至右依次计算各个表达式的值,最后计算的表达式的值和类型便是整个表达式的值和类型
例程1:
#include<iostream>
using namespace std;
int main()
{
int a = 1, b, c;//int a=1; b,c也是int类型只不过没有在这一行初始化
a = (b = a + 1, c = b + 1, a = c + 1) + a;//a=(b=2,c=2+1,a=3+1)+4
//b = (a = c + 1, c = a + 2, b = a + 1) + b;//a=(a=2+1 +1,c=2+1+1 +2,b=4+1)+5
cout << "a=" << a << " " << "b=" <<b<< " " <<"c="<< c << endl;//a=8,b=2,c=3
system("pause");
return 0;
}
输出的a=?,b=?
-原理
*使用逗号运算符是为了把几个表达式放在一起
*整个逗号表达式的值为系列中最后一个表达式的值
*从本质上讲,逗号的作用是将一系列运算按顺序执行
<表达式1> <表达式2>
/*求解过程是:先求解表达式 1,再求解表达式 2。整个逗号表达式的值是表达式 2 的值
最右边的那个表达式的值将作为整个逗号表达式的值,其他表达式的值会被丢弃*/
int a = 1, b, c;//int a=1; b,c也是int类型只不过没有在这一行初始化
a = (b = a + 1, c = b + 1, a = c + 1) + a;//a=8
在这里,首先把括号里的b赋值为a+1(1+1=2),把c赋值为b+1(2+1=3),把a赋值为c+1(2+1=3),尽管如此,还是取最右边的表达式,也就是a=c+1=(2+1)+(a+1)+1=,最后加上a的值a
值经过括号内的三个表达式赋值,已全部更新,b=2,c=3,a=4,取最右边的a=4和括号外的+a进行运算,则a=a+a=4+4=8;
这里有迭代赋值的思想,总之更新变量就行
下面这个例子充分体现了逗号运算符只取最右边表达式的结果
int x = 1;
x = (x + 1, x + 2, x + 3) + x;//(1+3)+1=5,(x+3)+x;
cout << "x=" <<x<< endl;//x=5(运行结果)
b,c没有初始化,默认值是0,不信的话,运行下面这段代码,结果跟上面那段代码是一样的
#include<iostream>
using namespace std;
int main()
{
int a = 1;
int b = 0;
int c = 0;
a = (b = a + 1, c = b + 1, a = c + 1) + a;//a=(b=2,c=2+1,a=3+1)+4
//b = (a = c + 1, c = a + 2, b = a + 1) + b;//a=(a=2+1 +1,c=2+1+1 +2,b=4+1)+5
cout << "a=" << a << " " << "b=" <<b<< " " <<"c="<< c << endl;//a=8,b=2,c=3
system("pause");
return 0;
}
var = (count=19, incr=10, count+1);
在这里,首先把 count 赋值为 19,把 incr 赋值为 10,然后把 count 加 1,最后,把最右边表达式 count+1 的计算结果 20 赋给 var。上面表达式中的括号是必需的,因为逗号运算符的优先级低于赋值操作符
int x1 = 1;
int x2 = 2;
int x3 = 3;
int y = (x1 =x2+ 1, x2 =x1+ 1, x3=x2 + 1) + 1;//(x1=3,x2=1+1=2,x3=x1+1+1
int y1 = (x1 = 1, x2 = 4, x3 = x2+6) + x3;
cout << "y1=" << y1 << endl;//y1=20(运行结果)
cout << "y=" << y << endl;//y=6(运行结果)
解析1:
int y = (x1 =x2+ 1, x2 =x1+ 1, x3=x2 + 1) + 1
这一段含逗号运算符的括号内与最右边的表达式x3=x2+1有关的数据是:
x2,而x2=x1+1,这里的x1=x2+1 涉及到了前两个左边的表达式,所以依次计算
x1=x2+1=2+1=3 - -> x2=x1+1=3+1=4 --> x3=x2+1=4+1=5
最后再加上括号外的值1,就是y=5+1=6
解析2:
int y1 = (x1 = 1, x2 = 4, x3 = x2+6) + x3;
这一段含逗号运算符的括号内与最右边表达式x3=x2+6相关的数据是
x2,而x2与x2=4相关
所以括号内的最右边表达式结果为x3=4+6=10
最后在加上括号外的x3的最新值也是x3=4+6=10
最后y1=10+10=20
这种方法应该叫倒推法叭~
尝试运行下面的实例,理解逗号运算符的用法
#include <iostream>
using namespace std;
int main()
{
int i, j;
j = 10;
i = (j++, j+100, 999+j);
cout << i;
return 0;
}
这个程序中,j 最初的值为 10,然后自增到 11,接着再加上 100 并将结果赋值给 j,最后 j 再加上 999,得出结果 1110