C++ if()括号中写多个条件

C++语言中if()中可以写多个条件
&&:并且
||:或者
!:否定

&&、|| 和 !的优先级从高到低依次为:
! > && > ||

比如:
if(a>1 && a<100)表示a大于1且小于100;
if(a<1 || a>100)表示a小于1或者a大于100;
if(a%4 == 0 && a%100 !=0 || a%400 == 0)表a所代表的年份是闰年(年数是4的倍数且不是100的倍数或年数是400的倍数)。

以下内容修改自:http://c.biancheng.net/view/1360.html

&& 运算符

&& 运算符被称为逻辑与运算符。它需要两个表达式作为操作数,并创建一个表达式,只有当两个子表达式都为 true 时,该表达式才为 true。
以下是使用&& 运算符的 if 语句示例:

if ((temperature < 20) && (minutes > 12))
cout << "The temperature is in the danger zone.";

请注意,这两个被逻辑与运算符连接在一起的表达式都是完整的表达式,它们的值可以被评估为 true 或 false。首先评估 temperature < 20 以产生 true 或 false 的结果,然后评估 minutes>12 以产生 true 或 false 的结果,最后,这两个结果被 AND 并列在一起,以得出整个表达式的最终结果。
仅当 temperature 小于 20 且 minutes 大于 12 时,cout 语句才会执行,其中只要有一个表达式的结果被评估为 false,则整个表达式为 false,不执行 cout 语句。

注意,如果 && 运算符左侧的子表达式为 false,则不会检查右侧的表达式。因为只要有一个子表达式为 false,则整个表达式都为 false,所以再检查剩余的表达式会浪费 CPU 时间。这被称为短路评估

|| 运算符

|| 运算符被称为逻辑或运算符。它需要两个表达式作为操作数,并创建一个表达式,当任何一个子表达式为 true 时,该表达式为 true。
以下是一个使用 || 运算符的 if 语句示例:

if ((temperature < 20) || (temperature > 100))
cout << "The temperature is in the danger zone.";

如果 temperature 小于 20 或者大于 100,那么 cout 语句将被执行。这两个子表达式只要其中一个为 true,则整个表达式为 true,执行 cout 语句。
注意,被逻辑或连接在一起的两件事情应该都是逻辑表达式,它们的值为 true 或 false,按以下形式书写的if条件是不正确的:

if (temperature < 20 || >100)

只要其中一个子表达式为 true,则整体表达式为 true,此时另外一个子表达式无论是 false 还是 true 都无关紧要。
需要注意的是, || 运算符也将进行短路评估。如果 || 运算符左侧的子表达式为 true,则右侧的子表达式将不被检查,因为只要有一个子表达式为 true,那么整体表达式就可以被评估为 true。

!运算符

!运算符被称为逻辑非运算符,执行逻辑 NOT 操作。它可以反转一个操作数的真值或假值。换句话说,如果表达式为 true,那么 !运算符将返回 false,如果表达式为 false,则返回 true。
以下是一个使用 !运算符的 if 语句示例:
if (!(temperature > 100))
cout << “You are below the maximum temperature. \n”;
首先,表达式(temperature > 100) 将被测试为 true 或 false,然后!运算符被应用于该值。如果表达式(temperature > 100) 为 true,则!运算符返回 false。如果为 false,则!运算符返回 true。在该例子中,它相当于问“温度是不是不大于 100 ? ”或“温度大于 100 是不是假的?”

布尔变量和!运算符
布尔变量的一个有趣特性是它的值可以简单地通过命名来测试。假设 moreData 是一个布尔变量,其测试语句如下:
if (moreData == true)
它可以简写为:
if (moreData)
再来看以下语句:
if (moreData == false)
它可以使用逻辑非运算符简写为:
if (!moreData)

&& 、 || 和 !的优先级

&& 、 || 和 !的优先级为:
!> && > ||
!运算符比许多 C++ 运算符具有更高的优先级。因此,为了避免错误,应始终将其操作数括在括号中,除非打算将其应用于没有其他操作符的变量或简单表达式。例如,来看以下表达式:
!(x > 2)
!x > 2
第一个表达式将 !运算符应用于表达式 x > 2,它是在问“x 是否不大于 2”,然而,第二个表达式是将 !运算符应用于到 x。它是在问“x 的逻辑是否大于 2”。假设 x 被设置为 5,由于 5 是非零值,所以被认为是 true,而 !运算符会将其反转为 false,即为 0,然后, > 运算符将确定 0 是否大于 2。为了避免这种错误,始终使用括号是明智的。
&& 和 || 运算符的优先级低于关系运算符,这意味着关系表达式先进行计算,然后再通过 && 和 || 运算符进行评估,因此有:
a > b&& x < y 等同于(a > b) && (x < y)
a > b || x < y 等同于(a > b) | | (x < y)
因此,在关系运算符与 && 和 || 混合时,通常不需要括号。当然,无论如何,使用括号都是一个好主意,因为它们可以让程序更易读。
在 && 和 || 同时使用的情况下,更是强烈地推荐使用括号,这是因为 && 的优先级高于 || 。如果没有括号表示执行顺序,那么 && 将永远在 || 之前完成,这可能并不符合编写者的初衷。
例如,假设有 3 个布尔变量 recentGrad、employed 和 goodCredit,则以下表达式:
recentGrad || employed && goodCredit
等同于以下表达式:
recentGrad || (employ && goodCredit)
但是它并不等同于以下表达式:
(recentGrad || employed) && goodCredit

  • 24
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的带括号的多位数运算计算器的C++代码示例: ```c++ #include <iostream> #include <stack> #include <cstring> using namespace std; // 判断是否是数字 bool isDigit(char c) { return c >= '0' && c <= '9'; } // 判断是否是运算符 bool isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 判断运算符优先级 int priority(char c) { if (c == '+' || c == '-') return 1; if (c == '*' || c == '/') return 2; return 0; } // 计算表达式 int calculate(int num1, int num2, char op) { switch (op) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': return num1 / num2; default: return 0; } } // 处理括号内的表达式 int processExpression(stack<int>& nums, stack<char>& ops) { int num2 = nums.top(); nums.pop(); int num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); return calculate(num1, num2, op); } // 计算带括号的多位数表达式 int calculateExpression(string expr) { stack<int> nums; stack<char> ops; for (int i = 0; i < expr.length(); i++) { char c = expr[i]; if (isDigit(c)) { int num = 0; while (i < expr.length() && isDigit(expr[i])) { num = num * 10 + (expr[i] - '0'); i++; } i--; nums.push(num); } else if (isOperator(c)) { while (!ops.empty() && priority(c) <= priority(ops.top())) { nums.push(processExpression(nums, ops)); } ops.push(c); } else if (c == '(') { ops.push(c); } else if (c == ')') { while (ops.top() != '(') { nums.push(processExpression(nums, ops)); } ops.pop(); } } while (!ops.empty()) { nums.push(processExpression(nums, ops)); } return nums.top(); } int main() { string expr = "2*(3+4)-5/(6-2)"; int result = calculateExpression(expr); cout << result << endl; return 0; } ``` 在这个代码中,我们使用两个栈来处理表达式:一个存储数字,一个存储运算符。我们遍历表达式的每个字符,如果是数字,则继续读取下一个字符,直到读到一个非数字字符为止,并将整个数字压入数字栈中。如果是运算符,则将其与运算符栈中的运算符进行比较,如果当前运算符的优先级较低,则将运算符栈中的运算符弹出,并从数字栈中弹出两个数字进行计算,并将计算结果压入数字栈中,直到当前运算符的优先级高于栈顶运算符或者运算符栈为空为止。如果是左括号,则将其压入运算符栈中。如果是右括号,则将运算符栈中的运算符弹出,并从数字栈中弹出两个数字进行计算,并将计算结果压入数字栈中,直到找到左括号为止。最后,如果运算符栈中还有运算符,则将其弹出,并从数字栈中弹出两个数字进行计算,并将计算结果压入数字栈中,直到运算符栈为空为止。最终,数字栈中的唯一元素就是表达式的计算结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值