在IF语句中使用多个OR或AND条件

9
我对IF语句有一个基本的疑问。假设我想用一个大小为3的字符数组来匹配字符串SUN。
if(arr[0]!='S' || arr[1]!='U' || arr[2]!='N')

cout << "no";

else

cout<< "yes";

在 If 语句中,所有条件都会被检查吗?还是只要有一个不符合就返回 false?

如果所有条件都会被检查,那么检查的顺序是从右到左还是从左到右?


1
C和C++不会“评估”任何特定方向,它们在像这样的情况下进行短路计算 - CodaFi
一个由 ||&& 组成的链式表达式会从左到右进行求值。如果在到达表达式末尾之前可以确认结果,计算将提前终止。 - Sergey Kalinichenko
@Lundin 或许我应该澄清一下:对我来说,“评估”具有强烈的暗示,至少是针对解释型语言而言。二进制文件不会在运行时“评估”。而你刚才所描述的正是我刚刚链接到的内容。 - CodaFi
你应该查看这篇文章,它解释得非常好 ;) http://stackoverflow.com/q/23940505/2003898 - dhein
在这个上下文中,“评估”是指操作数(对于某个运算符)的求值顺序,这是C和C++标准中的一个正式术语。 - Lundin
显示剩余6条评论
3个回答

18
根据C++标准:
1. "&&" 运算符从左到右分组。操作数都被上下文转换为bool类型(第4条款)。如果两个操作数都为真,则结果为真;否则为假。与 "&" 不同,"&&" 保证从左到右进行评估:如果第一个操作数为假,则第二个操作数不会被评估。
并且
1. "||" 运算符从左到右分组。操作数都被上下文转换为bool类型(第4条款)。如果其任一操作数为真,则返回真;否则为假。与 "|" 不同,"||" 保证从左到右进行评估;此外,如果第一个操作数为真,则第二个操作数不会被评估。

1

在第一个不匹配时返回“true”。C和C ++中的运算符都“短路”。也就是说,当左侧返回true时,OR运算符不会评估其右侧。如果左侧返回false,则AND运算符不会评估其右侧。


0

你编写的if语句在满足至少一个条件时执行cout << "no";

在这种情况下,如果你的输入是"GUN",程序会检查:

  • 'G' != 'S' -> 是
  • 'U' != 'U' -> 否
  • 'N' != 'N' -> 否

由于第一个条件被满足,程序将执行cout << "no";

如果if语句是:

if(arr[0]!='S' && arr[1]!='U' && arr[2]!='N')
  cout << "no";
else
  cout<< "yes";

要执行cout << "no";所有条件都必须被满足。

对于"GUN"来说:

  • 'G' != 'S' -> YES
  • 'U' != 'U' -> NO
  • 'N' != 'N' -> NO

由于有两个NO,程序将执行cout<< "yes";

所以:

  • ||只需要满足一个条件
  • &&需要满足所有条件

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接