一表达式
在C++中,任何值或者任何有效值和运算符号的组合都是表达式 。
对任何表达式加上分号都可以成为语句。
如:
当判断表达式的值这种操作改变了内存中数据的值时,我们说表达式有副作用。因此,判定表达式会带来这样的副作用,即修改被复制者的值
10//值为10的表达式
10+10//值为20的表达式
x=20//表达式的值为20
x<y//这样的关系表达式将被判定为bool值
同时,C++规定,逗号表达式的值是第二部分(或最后一部分 )的值。
如:
int i ,j ,k= 0;
i = (j = 20, k = 2 * j, j = 30 , j = -1);
cout <<"i:" << i << endl;
cout << "j:" << j << endl;
cout << "k:" << k << endl;
i = (j = 20, k = 2 * j);
cout << "i:" << i << endl;
cout << "j:" << j << endl;
cout << "k:" << k << endl;
输出结果:
在所有运算符中,逗号运算符的优先级最低。
递增运算符和递减运算符
int num = 24,300; //set num 24
int num = (24,300);//set num 300
递增运算符和递减运算符
以几个特殊的式子为例:
int x = 0;
int j = (4 + x++) + (6 + ++x);
x = 0;
int k = 2 * x++*(3 - ++x); //don;t do it except as an experiment
x = 0;
int z = (4 + x++) + (6 + ++x) + (--x);
cout << j << endl;
cout << k << endl;
cout << z << endl;
输出结果(win10 ,vs2015):
12
4
10
解析:
第一个式子:(4+x++)不是一个完整的表达式,,整条赋值语句才是一个完整的表达式C++不保证x的值在计算(4+ x++)后立刻增1。只保证在下一条语句执行前,x增2.
第二个式子和第三个式子,在同一语句中通知执行 前++和后++,结果是不可预期的,与具体的系统有关。在本例子的环境中,先执行完所有的后递增操作,然后计算整个表达式,最后执行前递增操作。
指针递增:
//指针自增
int arr[2] = { 0,2 };
int*pt = arr;
int *pt_2 = arr;
++*pt;//++应用于pt指向的值,pt仍然指向arr[0]
*++pt_2;//++应用于pt2,pt_2指向arr[1]
printf("%d/n", ++*pt);
printf("%d",*++pt_2);
输出结果1,2
另外关系运算符的优先级比算术运算符低
如:
x + 3 > y -2;
等同于
(X + 3)>(y - 2);
可以通过以下两点来判定C++中的左值
1 有名字
2 可以在内存中寻址
所以左值都是可以被修改的。
如:
x=20//左值,表达式为x的值
++x//左值,表达式为x的值
x+20//非左值,返回中间值,临时对象
x==//非左值,返回中间值,临时对象