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