C++语言使用运算符和表达式对数据进行操作处理。运算符是程序中用于表示各种运算的符号。高级语言采用类似数学计算的方式来表示各种运算,例如 y = x + 10 ; 其中 y 和 x 代表变量,而 = 和 + 代表运算符。表达式就是由运算符、操作变量、分隔符按照一定规则组成的,上面的 x + 10 就是一个表达式。一般情况下,表达式都会有一个结果,我们将其运算的结果赋值给变量 y。运算符和表达式的概念来源于数学,这种运算方式对于程序员来说相当的自然易懂!C++语言所支持的基本运算方式有算术运算,关系运算,逻辑运算,赋值运算,位运算等等,其实就是根据运算符来区分的。
1. 赋值运算和赋值表达式:将右边操作数或表达式结果保存至左边变量标识的内存空间中。
int y = 10; // 声明变量y, 并赋予初值为10
int x = 20; // 声明变量x, 并赋予初值20
y = x + 10; // 让x代表的数值加上10之后再赋值给y,那么y就从10变成30
std::cout << y << std::endl; // 输出 30
y = y + x; // 让x代表的数值加上y代表数值相加再赋值给y,那么y就变成50
std::cout << y << std::endl; // 输出 50
y += x; // 等价于 y = y + x;
std::cout << y << std::endl; // 输出70
赋值运算是 = 等于号。C++中有一类集运算和赋值功能于一身的符合赋值运算符,例如:+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=。他们的意思就是先进行运算再进行赋值。
2. 算术运算和算术表达式:实现加,减,乘,除,以及求模计算。
x = 30;
y = 10;
y = x - 10; // 减法运算
std::cout << y << std::endl; // 输出 20
y = x * 10; // 乘法运算
std::cout << y << std::endl; // 输出 300
y = x / 10; // 除法运算
std::cout << y << std::endl; // 输出 3
y = x / 4; // 整数和整数运算结果是整数
std::cout << y << std::endl; // 应该是7.5,但是输出 7
y = x / 4.0; // 整数和小数运算结果是小数
std::cout << y << std::endl; // 应该是7.5,但是输出 7,因为y是整数类型
float z = 0;
z = x / 4.0; // 使用浮点型数据来接收小数结果
std::cout << z << std::endl; // 输出 7.5
y = x % 4; // 求模运算,也叫求余运算,如果能够整除结果就是0
std::cout << y << std::endl; // 输出 2,因为30÷4的余数是2
y++; // 等价于 y = y + 1;
std::cout << y << std::endl; // 输出 3
--y; // 等价于 y = y - 1;
std::cout << y << std::endl; // 输出 2
求模运算就是计算两个整数相除后的余数,例如 3 % 2 = 1
除法运算符的操作数可以是整数或实数,整数除整数得整数,实数除实数得实数,整数除实数或者实数除整数得结果都是实数,另外除数不可以是零。
自增(++)和自减(--)运算符属于单目运算符,其操作数只能是变量,其功能是在变量的基础上加1或减1,运算符在变量的前后只会影响其返回值!
3. 关系运算和关系表达式:对操作数进行大小比较的运算就是关系运算。
bool m = 1 > 2; // 使用bool类型接收关系运算结果
std::cout << m << std::endl; // 输出 0,代表假,也就是false
m = 2 > 1;
std::cout << m << std::endl; // 输出 1,代表真,也就是true
x = 10;
y = 20;
m = x == y;
std::cout << m << std::endl; // 输出 0,代表假,也就是false
m = x == y - 10;
std::cout << m << std::endl; // 输出 1,代表真,也就是true
m = y != (x - 5) * 4; // 实际两者是相等的,但是我们的运算符是不等于
std::cout << m << std::endl; // 输出 0,代表假,也就是false
关系运算符包括<、<=、>、>=、==、!=
关系做算的结果是一个逻辑布尔值:true或fase。true就是1(非0都为true),false就是0。
4. 逻辑运算和逻辑表达式:!是非(取反)操作,&&是且,||是或操作
bool n = 1 && 2; // 操作符两边都是真,结果才是真
std::cout << n << std::endl; // 输出 1
n = 1 && 0; // 0假,非0是真
std::cout << n << std::endl; // 输出 0
x = 9;
y = 11;
n = x > 10 && y > 10;
std::cout << n << std::endl; // 输出 0
n = x > 10 || y > 10; // 操作符两边有一个是真,结果就是真
std::cout << n << std::endl; // 输出 1
n = !0; // 取反操作符,假取反就是真
std::cout << n << std::endl; // 输出 1
n = !(x > 10) && y > 10;
std::cout << n << std::endl; // 输出 1
逻辑运算的结果是一个逻辑布尔值:真(true=1)或假(fase=0)
&&和||运算从左到右顺序求值。
&& 中有一个表达式为假则整个结果就是假,||中有一个表达式为真则整个结果就是真。
5. 位运算和位表达式:包括左移<<,右移>>,取反~,与&,或|,异或^六种运算符。
char i = 65;
char j = i << 2;
std::cout << (int)j << std::endl; // 输出 4
// 00110011 & 00111100 = 00110000
char s1 = (char)51 & (char)60;
std::cout << (int)s1 << std::endl; // 输出 48
long long s2 = convertDecimalToBinary(s1);
std::cout << s2 << std::endl; // 输出 110000
// 00110011 | 00111100 = 00111111
s1 = (char)51 | (char)60;
std::cout << (int)s1 << std::endl; // 输出 63
s2 = convertDecimalToBinary(s1);
std::cout << s2 << std::endl; // 输出 111111
// 00110011 ^ 00111100 = 00001111
s1 = (char)51 ^ (char)60;
std::cout << (int)s1 << std::endl; // 输出 15
s2 = convertDecimalToBinary(s1);
std::cout << s2 << std::endl; // 输出 1111
位运算符一般用于操作数据的二进制,不经常使用。
6. 其他运算符
Sizeof 运算符用于获取数据类型或表达式结果的字节数。
int a = sizeof(int);
std::cout << a << std::endl; // 输出 4,说明int数据类型占4个字节
a = sizeof(100);
std::cout << a << std::endl; // 输出 4,说明常量数字100是一个int整型
double b = 3.14;
a = sizeof(b);
std::cout << a << std::endl; // 输出 8,说明变量b占8个字节
typeid运算符用于获取数据类型或表达式结果的数据类型
int c = 20;
std::cout << typeid(c).name() << std::endl; // 输出 int
std::cout << typeid(c > 10).name() << std::endl; // 输出 bool
条件运算符 ?: 是唯一的三目运算符,使用方式为:<表达式1> ? <表达式2> : <表达式3>
如果表<表达式1>的结果是真,那么执行<表达式2>,否则执行<表达式3>
int d = 20;
int e = d >= 20 ? 25 : 15;
std::cout << e << std::endl; // 输出 25
运算符是有优先顺序的,例如,乘除运算符高于加减运算符,和我们数学算术(先乘除后加减)的顺序是一样的。
int f = 1 + 2 * 3; // 先乘除后加减
std::cout << f << std::endl; // 输出 7
运算符大致的优先顺序如下:自加/自减 > 乘除 > 加减 > 关系 > 逻辑 > 条件 > 赋值
一般情况,我们基本不会去构造一个非常复杂的运算表达式,里面包含很多变量和运算符,而是将其拆分成几个子表达式独立运算,或者使用小括号来隔离成几个子表达式。这样让复杂的表达式能够清晰的体现它的逻辑意义。
本课程的所有代码案例下载地址:
C++示例源代码(配合教学课程使用)-C/C++文档类资源-CSDN下载
备注:这是我们游戏开发系列教程的第一个课程,主要是编程语言的基础学习,优先学习C++编程语言,然后进行C#语言,最后才是Java语言,紧接着就是使用C++和DirectX来介绍游戏开发中的一些基础理论知识。我们游戏开发系列教程的第二个课程是Unity游戏引擎的学习。课程中如果有一些错误的地方,请大家留言指正,感激不尽!