【C++ Primer Plus学习记录】逻辑表达式

2023-12-13 04:03:08

一、逻辑OR运算符:||

如果表达式中的任何一个或全部都为true(或非零),则得到的表达式的值为true;否则,表达式的值为false。

||的优先级比关系运算符低。

C++规定,||运算符是个顺序点。即,先修改左侧的值,再对右侧的值进行判定。如果左侧的表达式为true,则C++将不会去判定右侧的表达式,因为只要一个表达式为true,则整个逻辑表达式为true。

程序清单6.4在一条if语句中使用||运算符来检查某个字符的大写或小写。另外,它还使用了C++运算符的拼接特性(参见第4章)将一个字符串分布在3行中。

#if 1
#include<iostream>
using namespace std;

int main()
{
	cout << "This program may reformat your hard disk\n"
		"and destroy all your data.\n"
		"Do you wish to continue?<y/n>";
	char ch;
	cin >> ch;
	if (ch == 'y' || ch == 'Y')
		cout << "You were warned!\a\a\n";
	else if (ch == 'n' || ch == 'N')
		cout << "A wise choice ... bye\n";
	else
		cout << "That wasn't a y or n!Apparently you "
		"can't follow\ninstructions,so "
		"I'll trash your disk anyway.\a\a\a\n";

	system("pause");
	return 0;
}
#endif

二、逻辑AND运算符:&&

仅当原来的两个表达式都为true时,得到的表达式的值才为true。

和||运算符一样,&&运算符也是顺序点,因此将首先判定左侧,并且在右侧被判定之前产生所有的副作用。如果左侧为false,则整个逻辑表达式必定为false,在这种情况下,C++将不会再对右侧进行判定。

程序清单6.5演示了如何使用&&来处理一种常见的情况——由于两种不同的原因而结束while循环。在这个程序清单中,一个while循环将值读入到数组。一个测试(i < ArSize)在数组被填满时循环结束,另一个测试(temp>=0)让用户通过输入一个负值来提前结束循环。该程序使用&&运算符将两个测试组合成一个条件。该程序还使用了两条if语句、一条if else语句和一个for循环,因此它演示了本章和第5章的多个主体。

//&&
#if 1
#include<iostream>
using namespace std;
const int ArSize = 6;

int main()
{
	float naaq[ArSize];

	cout << "Enter the NAAQs (New Age Awareness Quotients) "
		<< "of\nyour neighbors.Program terminates "
		<< "when you make\n" << ArSize << " entries "
		<< "or enter a negative value.\n";

	int i = 0;
	float temp;
	cout << "First value: ";
	cin >> temp;//首先将第一个输入值读入到临时变量temp中

	while (i < ArSize && temp >= 0)//查看数组中是否还有空间以及输入值是否为非负(temp>=0)
	{
		naaq[i] = temp;
		++i;
		if (i < ArSize)
		{
			cout << "Next value: ";
			cin >> temp;
		}
	}
	if (i == 0)
		cout << "No data--bye\n";
	else
	{
		cout << "Enter your NAAQ: ";
		float you;
		cin >> you;
		int count = 0;
		for (int j = 0; j < i;j++)
		if (naaq[j] > you)
			++count;
		cout << count;
		cout << " of your neighbors have greater awareness of\n"
			<< "the New Age than you do.\n";
	}

	system("pause");
	return 0;
}
#endif

三、用&&来设置取值范围

&&运算符允许建立一系列if else if else语句,其中每种选择都对应于一个特定的取值范围。程序清单6.6演示了这种方法。

另外,它还演示了一种用于处理一系列消息的技术。与char指针变量可以通过指向一个字符串的开始位置来标识该字符串一样,char指针数组也可以标识一系列字符串,只要将每一个字符串的地址赋给各个数组元素即可。程序清单6.6使用qualify数组来存储4个字符串的地址,例如,qualify[1]存储字符串“mud tug-of-war\n”的地址。然后,程序就能够将cout、strlen()或strcmp()用于qualify[1],就像用于其他字符串指针一样。使用const限定符可以避免无意间修改这些字符串。

//6.6
#if 1
#include<iostream>
using namespace std;

const char * qualify[4] =  //char指针数组也可以标识一系列字符串,只要将每一个字符串的地址赋给各个数组元素即可
{
	"10000-meter race.\n",
	"mud tug-of-war.\n",
	"masters canoe jousting.\n",
	"pie-throwing festival.\n"
};

int main()
{
	int age;
	cout << "Enter your age in years: ";
	cin >> age;
	int index;

	if (age > 17 && age < 35)
		index = 0;
	else if (age >= 35 && age < 50)
		index = 1;
	else if (age >= 50 && age < 65)
		index = 2;
	else
		index = 3;

	cout << "You qualify for the  " << qualify[index];

	system("pause");
	return 0;
}
#endif

四、逻辑NOT运算符:!

!运算符将它后面的表达式的真值取反。

!运算符的优先级高于所有的关系运算符和算术运算符。因此,要对表达式求反,必须用括号将表达式括起,如下:

!(x > 5)
!x > 5

第二个表达式总是false,因为!x的值只能为true或false,而它们将被转换为1或0。?

程序清单6.7使用这种技术(将!运算符用于函数返回值)来筛选可赋给int变量的数字输入。如果用户定义的is_int()的参数位于int类型的取值范围,则返回true。然后,程序使用while(!is-int(num))测试来拒绝不在该取值范围内的值。

#if 1
#include<iostream>
#include<climits>//climits文件中定义了两个符号常量INT_MAX和INT_MIN
using namespace std;

bool is_int(double);//函数原型

int main()
{
	double num;
	cout << "Yo,dube!Enter an integer value: ";
	cin >> num;//将可能过大的int值作为double来读取

	while (!is_int(num))//函数调用
	{
		cout << "Out of range -- please try again: ";
		cin >> num;
	}
	int val = int(num);//强制类型转换
	cout << "You've entered the integer " << val << "\nBye\n";

	system("pause");
	return 0;
}

bool is_int(double x)//函数定义
{
	if (x <= INT_MAX && x >= INT_MIN)
		return true;
	else
		return false;
}

#endif

五、逻辑运算符细节

逻辑&&运算符的优先级高于逻辑||运算符。

文章来源:https://blog.csdn.net/qq_39072304/article/details/134887551
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。