《C++游戏编程入门(第4版)》——2.9 使用逻辑运算符

本节书摘来自异步社区出版社《C++游戏编程入门(第4版)》一书中的第2章,第2.1节,作者:【美】Michael Dawson(道森),更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.9 使用逻辑运算符

C++游戏编程入门(第4版)
目前为止,我们已经介绍了简单的表示真或假的表达式。然而,它们可以用逻辑运算符组合起来,形成更复杂的表达式。表2.2列出了逻辑运算符。

表2.2 逻辑运算符
《C++游戏编程入门(第4版)》——2.9 使用逻辑运算符

2.9.1 Designers Network程序简介

Designers Network程序模拟了一个计算机网络,只有选好的一部分游戏设计者才是网络成员。像现实世界的计算机系统一样,每个成员必须输入用户名和密码来登录。如果登录成功,成员将收到对其个人的问候。若要作为访客登录,用户只需在用户名或密码提示的后面输入guest即可。程序运行情况如图2-9~图2-11所示。

《C++游戏编程入门(第4版)》——2.9 使用逻辑运算符

图2.9 不是成员或访客则无法登录

《C++游戏编程入门(第4版)》——2.9 使用逻辑运算符

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

// Designers Network
// Demonstrates logical operators
#include <iostream>
#include <string>
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") )`
虽然额外的括号没有改变表达式的含义,但是可以让用&&运算符连接的两个较小的表达式显得更加醒目。
上一篇:千万别小看这些运算符背后的逻辑


下一篇:Android版Chrome开始支持更快的安全加密算法