【问题标题】:Check multiple OR operators in IF statement检查 IF 语句中的多个 OR 运算符
【发布时间】:2012-12-30 01:03:36
【问题描述】:

我有以下 C++ 代码:

if(x==y||m==n){
cout<<"Your message"<<endl;
}

如果 x 等于 y 或 m 等于 n,程序将打印“Your message”。但如果两个条件都为真,程序只测试其中一个并最终打印一个“Your Message”。

有没有办法使用单个 if 语句根据每个条件独立打印每个 "Your message"

使用多个 if 语句,输出将与以下相同。

if(x==y){
cout<<"Your message"<<endl;
}

if (m==n){
cout<<"Your message"<<endl;
}

【问题讨论】:

  • 感谢您的快速回复。那么我可能需要使用循环吗?
  • 听起来像 && 就是你想要的..
  • 是的,我已经想到了。但即使只有一个条件为真,我也需要程序打印消息。

标签: c++ if-statement conditional-statements


【解决方案1】:

如果您想查看这两个陈述是否为真,&amp;&amp; 就是您想要使用的。

查看Boolean Operators 以查看比较布尔(真/假)值时的所有可能选项。

回答你的问题:

    if ((x==y) && (m==n))
    {
        cout<<"Your Message"<<endl<<"Your Message"<<endl;
    }
    else if((x==y) || (m==n))  
    {
        cout<<"Your Message"<<endl;
    }

【讨论】:

  • 在您编辑之前无法删除反对票,但您确实在 5 分钟窗口内修复了它>。
  • @MooingDuck 我不确定。什么 5 分钟窗口?
  • 同一个人在 5 分钟内的任何编辑都算作一次编辑。所以它说你没有编辑,所以我不能改变我的投票。
【解决方案2】:

当两个条件都为真时,编译器只检查一个条件,因为您已将条件与 OR 联系起来。 如果 OR 链中的一个条件为真,则无需检查其他条件,因为结果已经为真,如果其中一个条件为假,则为假。因此,如果您认为您的逻辑是正确的,则无需进行多次检查。您的代码要求您在其中一个条件为真时打印一条消息并执行此操作。如果您想要两个条件都为真的情况下的特殊内容,请单独添加。很快,您就永远不要期望编译器对由 OR 连接的表达式进行所有检查。

问候,

吊艇架

【讨论】:

  • 好的,然后我应该使用两个 if。谢谢
【解决方案3】:

测试代码:

#include <iostream>
#include <string>
using namespace std;

void main() {
    int x=1;
    int y=1;
    int m=1;
    int n=1;
    string mess1="Your message 1\n";
    string mess2="Your message 2\n";
    cout<<((x==y)?mess1:"")+((m==n)?mess2:"");
    getchar();
}

【讨论】:

  • 这如何满足打印两个消息副本的请求?
  • 为什么not 运算符可以用((x==y) &amp;&amp; (m==n)) 完成同样的事情
  • 好吧,我刚刚测试过了,即使 x=y 和 m=n,它仍然显示一个“您的消息”。还是谢谢!
  • @Chase Walden 我弄错了这个问题,但不是用 nands 模拟 OR 语句的地方
  • @RicardoOrtegaMagaña:这更有意义。不用担心。
【解决方案4】:

并不是说我会这样做,但是...

for(int i = 0; i < (x==y)+(m==n); ++i) {
  std::cout << "Your message\n";
}


让我对此进行扩展。我永远不会这样做,因为它违反了两个原则:

1) 可维护性代码。这个循环会导致维护者停下来思考,并试图恢复你的初衷。一对if 语句不会。

2) 不同的输入应该产生不同的输出。这个原则有利于用户和程序员。没有什么比运行测试、获得有效输出以及仍然不知道程序走哪条路更令人沮丧的了。

鉴于这两个原则,以下是我的实际编码方式:

if(x==y) {
  std::cout << "Your x-y message\n";
}
if(m==n) {
  std::cout << "Your m-n message\n";
}

旁白:当你的意思是\n时,千万不要使用endl。它们生成语义相同的代码,但endl 可能会意外地让您的程序运行得更慢。

【讨论】:

  • 我开始考虑使用数组为它组织一个循环,但这更优雅和有效。
  • 是的,肯定是聪明的主意!但我需要一些更简单的东西,因为我的代码已经很复杂了!
  • 复杂?你会打电话给else 复合体吗?什么...?
  • 我怀疑它可以更简单。它只是比普通 if 多几个字符。其他解决方案,如分离成函数/ lamda 肯定会更大。如果您关心优化,那么我认为编译器无论如何都会展开循环。
  • 好吧,我正在尝试仅使用一个 if 来测试 2d 小区邻域。
【解决方案5】:

单个“|”或 "&" 保证双方评估,即使结果可以由左侧运算符单独确定。

【讨论】:

  • 谢谢你,你解决了我的问题!我认为这些仅用于“位对位”操作
【解决方案6】:

你可以做这样的事情来建立“信息”:

string msg = "Your Message\n";
string buildSt = x == y ? m == n ? msg + msg : msg : m == n ? msg : ""; 

【讨论】:

    【解决方案7】:

    我认为这是不可能的。括号内的内容是对或错的陈述,没有真/真或真/假陈述之类的东西。您可以做的是带有 break 语句的 do/while 循环。但我不认为这是要走的路。为什么要避免两个 if 语句?

    【讨论】:

    • 我正在专门检查二维数组值邻居,如果我有很多 if,我的代码会非常大。
    • @user1981497:哇,那么这个页面上的每个答案都对你的情况没有帮助。我会提出一个新问题并讲述网格 以及它是如何工作的。你会得到很多更好的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2012-02-22
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多