第五章 C++ 基本运算

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

关系运算符包括<<=>>===!=

关系做算的结果是一个逻辑布尔值:truefase。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游戏引擎的学习。课程中如果有一些错误的地方,请大家留言指正,感激不尽!

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咆哮的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值