本文共 3679 字,大约阅读时间需要 12 分钟。
本节书摘来自异步社区出版社《C++游戏编程入门(第4版)》一书中的第2章,第2.1节,作者:【美】Michael Dawson(道森),更多章节内容可以访问云栖社区“异步社区”公众号查看。
C++游戏编程入门(第4版)
目前为止,我们已经介绍了简单的表示真或假的表达式。然而,它们可以用逻辑运算符组合起来,形成更复杂的表达式。表2.2列出了逻辑运算符。表2.2 逻辑运算符
Designers Network程序模拟了一个计算机网络,只有选好的一部分游戏设计者才是网络成员。像现实世界的计算机系统一样,每个成员必须输入用户名和密码来登录。如果登录成功,成员将收到对其个人的问候。若要作为访客登录,用户只需在用户名或密码提示的后面输入guest即可。程序运行情况如图2-9~图2-11所示。
图2.9 不是成员或访客则无法登录
从Cengage Learning网站(www.cengageptr.com/downloads)上可以下载到该程序的代码。程序位于Chapter 2文件夹中,文件名为designers_network.cpp。
// Designers Network// Demonstrates logical operators#include#include using namespace std;int main(){ string username; string password; bool success; cout << "\tGame Designer’s Network\n"; do { cout << "\nUsername: "; cin >> username; cout << "Password: "; cin >> password; if (username == "S.Meier" && password == "civilization") { cout << "\nHey, Sid."; success = true; } else if (username == "S.Miyamoto" && password == "mariobros") { cout << "\nWhat’s up, Shigeru?"; success = true; } else if (username == "W.Wright" && password == "thesims") { cout << "\nHow goes it, Will?"; success = true; } else if (username == "guest" || password == "guest") { cout << "\nWelcome, guest."; success = true; } else { cout << "\nYour login failed."; success = false; } } while (!success); return 0;}```###2.9.2 使用逻辑与运算符逻辑与运算符&&可以连接两个表达式来形成更大的表达式。大的表达式也能计算成true或false。仅当被连接的两个表达式都为true时,新的表达式才为true;否则为false。就像“与”是“两者都”的意思,两个原始表达式都为true,新表达式才为true。下面给出Designers Network程序中的具体例子: ` if (username == "S.Meier" && password == "civilization")`仅当username == "S.Meier"和password == "civilization"同时为true时,表达式username == "S.Meier" && password == "civilization"才为true。这样很奏效,因为程序只希望在Sid输入其用户名和密码时才授权登录。只有一个正确则无法登录。还有一种理解&&工作原理的方式,就是看看真与假的所有可能的组合(见表2.3)。当然,Designers Network程序还对Sid Meier以外的其他用户有效。通过使用带else子句且使用&&运算符的一系列if语句,程序检测3对不同的用户名和密码。如果用户输入的一对用户名和密码存在,则会收到对其个人的问候。表2.3 使用与运算符的可能的登录组合![image](https://yqfile.alicdn.com/43981c2e170ba86a308b9acde4dabb262d50df00.png)###2.9.3 使用逻辑或运算符逻辑或运算符||可以连接两个表达式来形成更大的表达式。大的表达式也能计算成true或false。如果第一个表达式为true或第二个表达式为true,则新的表达式就为true;否则为false。就像“或”表示“其中之一”,如果两个表达式其中之一为true,则新的表达式为true(如果都为true,则大的表达式仍然为true)。下面给出Designers Network程序中的具体例子: ` else if (username == "guest" || password == "guest")`如果username == "guest"为true或password == "guest"为true,则表达式username == "guest" || password == "guest"为true。这样很奏效,因为程序希望只要用户在用户名或密码处输入guest就授权登录。如果用户在两处输入的都是guest,那样也可以。还有一种理解||工作原理的方式,就是看看真与假的所有可能的组合(见表2.4)。表2.4 使用或运算符的可能的登录组合![image](https://yqfile.alicdn.com/097f614ba9464cf825c60c3eee2ac7ef0ec95136.png)###2.9.4 使用逻辑非运算符逻辑非运算符!可以将表达式的真或假进行转换。如果原始表达式为false,则新的表达式为true;反之则新的表达式为false。就像“非”表示相反,新表达式的值与原表达式相反。下面在do循环的布尔表达式中使用非运算符: ` } while (!success);`当success为false时,表达式!success的值为true。这样很奏效,因为只有当登录失败的时候success才为false。在这种情况下,再次执行与do循环关联的程序块,并再次询问用户的用户名和密码。当success为true时,表达式!success的值为false。这样很奏效,因为当success为true时,用户已经成功登录且循环结束。还有一种理解!工作原理的方式,就是看看真与假的所有可能的组合(见表2.5)。表2.5 使用非运算符的可能的登录组合![image](https://yqfile.alicdn.com/476c5aac0efbbb6d9a6f9e636939ef3d50797c9a.png)###2.9.5 运算符的优先级同算术运算符一样,在表达式求值时逻辑运算符的优先级会影响它们的求值顺序。逻辑非!比逻辑与&&优先级高。逻辑与&&比逻辑或||优先级高。和使用算术运算符一样,如果希望先对低优先级的运算符进行计算,可以使用括号。我们还可以创建包含算术运算符、关系运算符和逻辑运算符的复杂表达式。运算符优先级定义了表达式中元素的求值顺序。然而,最好写成简单明了的表达式,而不是那种需要精通运算符优先级才能看懂的表达式。C++运算符及其优先级详见附录B。提示 尽管在大表达式中可以使用括号改变求值方式,但也可以使用冗余括号——不改变表达式值的括号——让表达式更清晰易懂。下面给出一个简单的例子。看看程序Designers Network中的表达式:`(username == "S.Meier" && password == "civilization")`再来看看带冗余括号的表达式:`( (username == "S.Meier") && (password == "civilization") )`虽然额外的括号没有改变表达式的含义,但是可以让用&&运算符连接的两个较小的表达式显得更加醒目。
转载地址:http://zqsel.baihongyu.com/