《C++游戏编程入门(第4版)》——1.6 使用变量进行算术运算

1.6 使用变量进行算术运算

C++游戏编程入门(第4版)
一旦有了存储值的变量,我们就希望在游戏的过程中改变它们的值——也许希望通过对击败Boss的玩家加分给予奖励,或许又希望降低气阀里的氧气含量。之前介绍的(和一些新的)运算符可以完成这些任务。

1.6.1 Game Stats 2.0程序简介

Game Stats 2.0程序对表示游戏统计值的变量进行操作并显示结果。程序运行结果如图1.6所示。

图1.6 使用不同方式更改每个变量

从Cengage Learning网站(www.cengageptr.com/downloads)上可以下载到该程序的代码。程序位于Chapter 1文件夹中,文件名为game_stats2.cpp。

// Game Stats 2.0
// Demonstrates arithmetic operations with variables
#include <iostream>
using namespace std;
int main()
{
   unsigned int score = 5000;
   cout << "score: " << score << endl;
   //altering the value of a variable
   score = score + 100;
   cout << "score: " << score << endl;
   //combined assignment operator
   score += 100;
   cout << "score: " << score << endl;
   //increment operators
   int lives = 3;
   ++lives;
   cout << "lives: "  << lives << endl;
   lives = 3;
   lives++;
   cout << "lives: " << lives << endl;
   lives = 3;
   int bonus = ++lives * 10;
   cout << "lives, bonus = " << lives << ", " << bonus << endl;
   lives = 3;
   bonus = lives++ * 10;
   cout << "lives, bonus = " << lives << ", " << bonus << endl;
   //integer wrap around
   score = 4294967295;
   cout << "\nscore: " << score << endl;
   ++score;
   cout << "score: " << score << endl;
   return 0;
}```
陷阱
 当编译该程序时,可能得到如[Warning] this decimal constant is unsigned这样的警告。好在,警告不会阻止程序的编译和运行。该警告是整数溢出的结果。您也许希望在程序中避免整数溢出。然而,本程序有意使用了这种溢出并显示这种情况的结果。1.6.5节在讨论这段程序时,将介绍关于整数溢出的知识。
###1.6.2 修改变量值
在创建一个用于存储玩家分数的变量并显示其值后,程序将score的值增加了100。

  ` score = score + 100;`
这条赋值语句的意思是把score的当前值加上100,然后再把结果赋给score。其效果是,变量score的值增加了100。

###1.6.3 使用组合赋值运算符
上面那一行代码有更简短的版本如下:

  ` score += 100;`
这条语句的结果和score = score + 100;一样。运算符+=称为组合赋值运算符,因为它组合了算术运算(这里是加法)和赋值运算。该运算符的意思是“将右边的全部与左边的全部相加,然后将结果赋给左边”。

前面见过的所有算术运算符都有组合赋值运算符的版本,详见表1.2。

<div style="text-align: center">
 <img src="https://yqfile.alicdn.com/78adf2dcadddc02d25c90b2e329efac1a59b5dd2.png" >
</div>

###1.6.4 递增运算符与递减运算符
接下来,程序使用递增运算符(++)使变量的值增加1。使用该运算符将变量lives的值增加了两次。第一次如下面一行:

 `  ++lives;`
第二次如下面一行:

 `  lives++;`
这两行的最终效果是一样的:将lives的值从3增加到4。

正如代码所示,我们可以将运算符置于需要增加的变量之前或之后。如果放在变量之前,运算符称为前置递增运算符;如果放在变量之后,则称为后置递增运算符。

现在您也许会认为前置和后置版本没有区别,但实际上不是这样。在只需要单个变量进行递增的情况下(如之前的代码),两个运算符的最终结果一样。但是在更加复杂的表达式中,结果可能会不同。

为了演示这种重要的区别,程序在每关游戏结束时进行了一次适当的计算。程序基于玩家的生命数计算奖励,而且会增加玩家的生命数。然而,程序使用了两种不同的方式进行这种计算。第一次使用前置递增运算符。

  ` int bonus = ++lives * 10;`
前置递增运算符会在较大的表达式使用变量之前增加变量的值。++lives10首先将lives值增加,然后再将增加结果乘以10。因此,代码与410的结果40相等。这意味着最后lives的值为4,bonus的值为40。

将lives的值置回3后,程序再次计算了bonus。这次使用的是后置递增运算符。

  ` bonus = lives++ * 10;`
后置递增运算符会在较大的表达式使用变量之后增加变量的值。lives++ * 10的结果是lives的当前值乘以10。因此,代码与3*10的结果30相等。经过本次计算后,lives的值被递增。执行完该行代码后,lives的值是4,bonus的值是30。

C++还定义了递减运算符—— −−。它除了对变量进行递减外,其他和递增运算符一样。递减运算符也包含了两种版本(前置和后置)。

###1.6.5 整数的溢出处理
当把整数变量的值增加到超过它能表示的最大值时会怎样?结果并不会产生错误,然而,这会“溢出”到类型能表示的最小值。接下来,程序要演示这种现象。首先,给score变量赋上它能存储的最大值:

 `  score = 4294967295;`
然后对变量做递增操作:

 `  ++score;`
结果是score变成0。其原因在于值溢出,和汽车的里程表在超过最大值时的情况非常类似(如图1.7所示)。

<div style="text-align: center">
 <img src="https://yqfile.alicdn.com/aaea56f5e24ae910304a6cdd14e222ce744b4c6b.png" >
</div>

图1.7 想象unsigned int型变量如何从最大值溢出到最小值

对整数变量递减超出它的最小值时会“溢出”到最大值。

提示
  保证选取的整型的值范围够用。
时间: 2024-10-28 16:19:24

《C++游戏编程入门(第4版)》——1.6 使用变量进行算术运算的相关文章

《C++游戏编程入门(第4版)》——1.5 声明和初始化变量

1.5 声明和初始化变量 C++游戏编程入门(第4版) 变量代表了计算机内存的某一部分,该部分被保留下来用于存储.检索和操作数据. 如果需要记录玩家的得分,则可以为它专门创建一个变量.这样一来,就可以读取并显示玩家得分.如果玩家将空中的外星敌人击毙,还可以将得分更新. 1.5.1 Game Stats程序简介 Game Stats程序显示在太空射击游戏中需要记录的诸如玩家得分.击毁敌人数目以及玩家防护盾是否开启等信息.该程序使用了一组变量来完成这些任务.程序如图1.5所示. 图1.5 游戏中每条

《C++游戏编程入门(第4版)》——2.14 问与答

2.14 问与答 C++游戏编程入门(第4版) 问:必须使用关键字true和false吗? 答:不一定,但最好这样做.在有关键字true和false之前,程序员经常使用1代表true,0代表false.然而,既然有了true和false,最好使用它们而不是过时的1和0. 问:可以将true或false以外的值赋给bool型变量吗? 答:可以.可以将表达式赋给bool型变量,变量将存储表达式的真或假. 问:可以使用switch语句对某个非整数值进行验证吗? 答:不可以.switch只能用于可以解释

《C++游戏编程入门(第4版)》——1.8 Lost Fortune简介

1.8 Lost Fortune简介 C++游戏编程入门(第4版) 本章最后一个项目Lost Fortune是一个拟人化的探险游戏.在游戏中,玩家输入一些信息,计算机把这些信息扩展成一个探险故事.程序的运行示例如图1.9所示. 图1.9 故事由玩家提供的细节构成 这里不一次展示全部代码,而是每次给出一部分.从Cengage Learning网站(www.cengageptr.com/ downloads)上可以下载到该程序的代码.程序位于Chapter 1文件夹中,文件名为lost_fortun

《C++游戏编程入门(第4版)》——1.9 本章小结

1.9 本章小结 C++游戏编程入门(第4版) 本章介绍了以下概念: C++是编写一流游戏的主要编程语言. C++程序由一系列的C++语句组成. C++程序的基本生命周期包括构思.设计.源代码.目标文件和可执行文件. 编程错误包括3类:编译错误.链接错误和运行时错误. 函数是一组能完成某些任务并返回一个值的一组程序语句. 每个程序都必须包含main()函数,它是程序的运行起始点. include指令告诉预处理器在当前文件中包含另一个文件. 标准库是一些文件的集合.程序文件可以包含这些文件来实现像

《C++游戏编程入门(第4版)》——2.11 理解游戏主循环

2.11 理解游戏主循环 C++游戏编程入门(第4版) 游戏主循环是游戏中事件流的一般表示方式.事件的核心部分要重复执行,因此称之为循环.尽管不同游戏的主循环的实现不尽相同,但是几乎所有不同种类的游戏的基本结构是一样的.无论是简单的太空射击游戏,还是复杂的角色扮演游戏(Role-Playing Game, RPG),游戏通常由游戏主循环中相同的重复部分组成.游戏主循环如图2.13所示. 图2.13 游戏主循环描述了几乎适用于任何游戏的基本事件流 下面解释游戏主循环的各个部分: 初始化设置.这部分

《C++游戏编程入门(第4版)》——1.2 编写第一个C++程序

1.2 编写第一个C++程序 C++游戏编程入门(第4版)到此为止,我们已经介绍了足够多的理论知识.现在来实践编写第一个C++程序.麻雀虽小,五脏俱全.该程序同样演示了在控制台窗口中显示文本的方法. 1.2.1 Game Over程序简介 程序员在学习新语言时,编写的第一个程序便是经典的Hello World程序,在屏幕上显示Hello World.Game Over程序打破了这个传统,显示的是Game Over!.该程序的运行结果如图1.2所示. 图1.2 您的第一个C++程序显示的是计算机游

《C++游戏编程入门(第4版)》——1.7 使用常量

1.7 使用常量 C++游戏编程入门(第4版)常量 是经过命名的无法修改的值.如果程序中频繁地使用到不变化的值,常量就很有用.例如,在编写太空射击游戏时,每个在空中击毁的外星人都值150分,那么就可以定义一个名为ALIEN_POINTS的常量,其值为150.然后每次需要使用外星人的分数时,就可以使用ALIEN_POINTS而不是数字150. 常量有两大优势.首先,它让程序更加清晰易懂.一眼看到ALIEN_POINTS,就能知道它的意思.如果查看的代码中有150,我们也许并不知道它代表的含义.第二

《C++游戏编程入门(第4版)》导读

前言 C++游戏编程入门(第4版)好莱坞能带来最好视觉效果.声乐效果以及纯粹的兴奋,顶级的计算机游戏也完全可以与其媲美.但是游戏这种娱乐方式与其他方式不同,它们能让玩家一连好几个小时守在屏幕跟前.能让游戏如此与众不同并且引人入胜的原因在于交互性.在计算机游戏中,我们不是坐下来观看主人公如何与怪物搏斗,而是自己担任主角.实现这种交互性的关键在于编程.编程让外星生物.外星人进攻中队或整支敌人军队在不同情况下对玩家做出不同的反应.编程让游戏的故事情节能够以新的方式展开.实际上,作为编程的结果,游戏可能

《C++游戏编程入门(第4版)》——2.6 使用while循环

2.6 使用while循环 C++游戏编程入门(第4版)只要表达式的值为true,那么while循环就可以重复执行部分代码.下面给出while循环的一般形式: while (expression) statement;``` 如果expression的值为false,则程序转到循环后面的语句.如果为true,则执行statement,然后再回过头来验证expression.整个过程一直重复到expression的值为false,然后循环结束. ###2.6.1 Play Again游戏简介 Pl

《C++游戏编程入门(第4版)》——2.7 使用do循环

2.7 使用do循环 C++游戏编程入门(第4版)像while循环一样,do循环也可以基于表达式重复执行部分代码.区别在于,do循环在每次循环迭代之后验证表达式.这意味着循环体总是至少要执行一次.下面给出do循环的一般形式: do statement; while (expression)``` 程序执行statement,且只要验证为true,循环就重复进行.一旦expression验证为false,则循环终止. ###2.7.1 Play Again 2.0程序简介 Play Again 2