3

我有以下 C++ 代码:

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

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

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

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

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

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

7 回答 7

10

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

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";
}

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

于 2013-01-15T20:22:15.380 回答
2

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

于 2013-01-15T20:22:31.797 回答
1

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

于 2013-01-15T20:27:57.337 回答
0

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

string msg = "Your Message\n";
string buildSt = x == y ? m == n ? msg + msg : msg : m == n ? msg : ""; 
于 2013-01-15T20:26:10.113 回答
0

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

问候,

吊艇架

于 2013-01-15T20:46:48.880 回答
-2

测试代码:

#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();
}
于 2013-01-15T20:22:35.593 回答
-2

如果你想看看这两个陈述是否都是真的,那么这&&就是你想要使用的。

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

要回答您的问题:

    if ((x==y) && (m==n))
    {
        cout<<"Your Message"<<endl<<"Your Message"<<endl;
    }
    else if((x==y) || (m==n))  
    {
        cout<<"Your Message"<<endl;
    }
于 2013-01-15T20:24:01.393 回答