表达式与语句
- 2 表达式与语句
- 2.1 算术运算符
2 表达式与语句
- 运算符就是具有运算功能的符号。
- “::” :作用域运算符。
- ->:成员指针运算符。
- 运算符种类:算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、移位运算符、sizeof运算符、条件运算符和逗号运算符。
2.1 算术运算符
- 算术运算符:的加(+)、减(-)、乘(*)、除(/)、模运算(%)、自增(++)、自减(–)。
// 算术运算符实例
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a=1,b=2;cout <<"a+b= "<< a+b <<endl; // 1+2cout <<"a+100= "<< a+100 <<endl; // 1+100cout <<"a-b= "<< a-b <<endl; // 1-2cout <<"a-100="<< a-100 <<endl; // 1-100cout <<"a*b="<< a*b <<endl; // 1*2cout <<"a*100="<< a*100 <<endl; // 1*100cout <<"a/b="<< a/b <<endl; // 1/2cout <<"a/100="<< a/100 <<endl; // 1/100cout <<"a%b="<< a%b <<endl; // 1%2cout <<"a%100="<< a%100 <<endl; // 1%100cout <<"a++:"<< a++ <<endl; // 先赋值,输出1,a再自增,a+=1;a=2cout <<"a--:"<< a-- <<endl; // 先赋值,输出2, a再自减,a-=1;a=1cout <<"++a:"<< ++a <<endl; // a自增,a+=1;a=2,再输出2cout <<"--a:"<< --a <<endl; // a自减,a-=1;a=1,再输出1return 0;
}
/* 运行结果:
a+b= 3
a+100= 101
a-b= -1
a-100=-99
a*b=2
a*100=100
a/b=0
a/100=0
a%b=1
a%100=1
a++:1
a--:2
++a:2
--a:1
Program ended with exit code: 0
*/
- 关系运算符:比较两个对象的大小,结果为true或false。
- 关系运算符种类:< ,> ,<= ,>= ,, !=。关系运算符
的优先级低于算术运算符,高于赋值运算符。<,<=,>,>=的优先级相同,高于和!=,==和!=的优先级相同。
// 算术运算符实例
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a=1,b=200,c=0;printf("a>b: %d\n",a>b); // 0 falseprintf("a>=b: %d\n",a>=b); printf("a<b: %d\n",a<b); // 1 trueprintf("a<=b: %d\n",a<=b);printf("a==b: %d\n",a==b);printf("a+1==c: %d\n",a+1==c);printf("a!=b: %d\n",a!=b);return 0;
}/* 运行结果
a>b: 0
a>=b: 0
a<b: 1
a<=b: 1
a==b: 0
a+1==c: 0
a!=b: 1
Program ended with exit code: 0*/
- 逻辑运算符:对真和假这两种逻辑值进行运算,运算后的结果仍是一个逻辑值。
- &&:逻辑与。,当两个对象都为真时,结果为真;有一个对象为假或两个对象都为假时,结果为假。
- ||: 逻辑或。当两个对象都为假时,结果为假;有一个对象为真或两个对象都为真时,结果为真。
- ! : 逻辑非。当对象为真时,运算结果为假;当对象为假时,运算结果为真。
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a =1, b=2,c=3;// && 逻辑与运算,两个表达式均为真,结果才为真。printf("(a>b && a> c): %d \n",a>b && a> c);printf("(a>b && a< c): %d \n",a>b && a< c);printf("(a<b && a<c): %d \n",a<b && a<c);// || 逻辑或运算,两个表达式均为真,结果才为真。printf("(a>b): %d \n",a>b || a> c);printf("(a>b || a< c): %d \n",a>b || a< c);printf("(a<b || a<c): %d \n",a<b || a<c);// 逻辑非运算,表达式为真,去非之后,结果为假,反之为真。printf("!(a>b): %d \n",!(a>b));printf("!(a<b): %d \n",!(a<b));return 0;
}
/* 运行结果
(a>b && a> c): 0
(a>b && a< c): 0
(a<b && a<c): 1
(a>b): 0
(a>b || a< c): 1
(a<b || a<c): 1
!(a>b): 1
!(a<b): 0
Program ended with exit code: 0
*/
- 赋值运算符:赋值运算符分为简单赋值运算符和复合赋值运算符,复合赋值运
算符又称为带有运算的赋值运算符,简单赋值运算符就是给变量赋值的运算符。 - 复合赋值运算符:是等同的简单赋值运算符和其他运算的组合。
- 复合赋值运算符: +=、-=、*=、/=、%=、<<=、>>=、&= 、!=、^=。
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a =1, b=2,c=3;// +=、-=、*=、/=、%=、<<=、>>=、&= 、!=、^=printf("a+=b: %d \n",a+=b); // a = a+b = 1+2 =3printf("a-=b: %d \n",a-=b); // a = a-b = 3-2 =1printf("a*=b: %d \n",a*=b); // a = a*b = 1*2 =2printf("a/=b: %d \n",a/=b); // a = a/b = 2*2 =1printf("a%=b: %d \n",a%=b); // a = a%b = 1%2 =1printf("a<<=c: %d \n",a<<=c);// a = a*2*2*2 = 8printf("a>>=c: %d \n",a>>=c);// a = a/2/2/2 = 1printf("a&=c: %d \n",a&=c); // a=a&c= 01(二进制) & 11 (二进制) = 01(二进制) = 1(十进制)printf("a|=c: %d \n",a|=c); // a=a|c= 01(二进制) | 11 (二进制) = 11(二进制) = 3(十进制)printf("a^=c: %d \n",a^=c); // a=a^c= 11(二进制) | 11 (二进制) = 00(二进制) = 0(十进制)return 0;
}/*a+=b: 3a-=b: 1a*=b: 2a/=b: 1a=b: 1a<<=c: 8a>>=c: 1a&=c: 1a|=c: 3a^=c: 0Program ended with exit code: 0*/
- 位运算符:有&(位逻辑与)、|(位逻辑或)、^(位逻辑异或)和~(取反运算符)。
- 位运算优先级:在双目运算符中,位逻辑与优先级:最高,位逻辑或次之,位逻辑异或最低。取反运算符为单目运算符。
13.位逻辑与:是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求与,若两个操作数对象同一位都为1,则结果对应位为1,否则结果中对应位为0。
14.位逻辑或:是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求或,若两个操作数对象同一位都为0,则结果对应位为0,否则结果中对应位为1。
15.位逻辑异或:将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求异或,若两个操作数对象同一位不同时为1,则结果对应位为1,否则结果中对应位为0。
16.取反运算符:将操作数转换成二进制表示方式,然后将各位二进制位由1变为0,由0变为1。
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a =1, b=2;printf("a&b: %d \n",a&b); // 1&2 = (二进制) 01&10 =00(二进制) = 0 (十进制)printf("a|b: %d \n",a|b); // 1|2 = (二进制)01|10 =11(二进制) = 3 (十进制)printf("a^b: %d \n",a^b); // 1^2 = (二进制)01^10 =11 (二进制)= 3 (十进制)printf("~a: %d \n",~a); // ~1 = (二进制)~00000001=10000010 (二进制)= -2 (十进制)return 0;
}
/*a&b: 0a|b: 3a^b: 3~a: -2Program ended with exit code: 0*/
- 移位运算符:<<(左移)和>>(右移),
- 左移: 将一个二进制操作数对象按指定的移动位数向左移,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用0补充。左移相当于乘以2的幂。
- 右移:将一个二进制的数按指定的位数向右移动,右边(低位端)溢出的位被丢弃,左边(高位端)的空位或者一律用0填充,或者用被移位操作数的符号位填充,运算结果和编译器有关,在使用补码的机器中,正数的符号位为0,负数的符号为1。
参考《C++从入门到精通》