3

私は次のC++コードを持っています:

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

xがyに等しいか、mがnに等しい場合、プログラムは「あなたのメッセージ」を出力します。ただし、両方の条件が当てはまる場合、プログラムはそのうちの1つだけをテストし、最終的に1つの「メッセージ」を出力します。

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


これについて詳しく説明しましょう。次の 2 つの原則に違反するため、この方法は絶対に行いません。

1) 保守性のためのコード。このループにより、メンテナーは立ち止まって考え、元の意図を取り戻そうとします。ifステートメントのペアはそうではありません。

2) 個別の入力は、個別の出力を生成する必要があります。この原則は、ユーザーとプログラマーに利益をもたらします。テストを実行して有効な出力を取得しても、プログラムがどのパスをたどったかがわからないことほどイライラすることはありません。

これら 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

それは不可能だと思います。ブラケットの中にあるのは、true または false のいずれかであるステートメントです。true/true または true/false ステートメントのようなものはありません。できることは、break ステートメントを使用した do/while ループです。しかし、私はそれが進むべき道だとは思いません。2 つの 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 で接続しているため、両方が true の場合、コンパイラは 1 つの条件のみをチェックします。OR チェーンの条件が 1 つでも true の場合、他の条件をチェックする必要はありません。結果は既に true であり、そのうちの 1 つが false の場合は false になります。したがって、ロジックが正しいと思われる場合は、複数のチェックを行う必要はありません。あなたのコードは、条件の 1 つが真であり、それを実行するプログラムである場合にメッセージを出力するように求めています。両方の条件が真の場合に特別なものが必要な場合は、個別に追加してください。すぐに、コンパイラが 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

両方のステートメントが真で&&あるかどうかを確認しようとしている場合は、 an を使用する必要があります。

ブール演算子を見て、ブール (true/false) 値を比較するときに可能なすべてのオプションを確認してください。

あなたの質問に答えるには:

    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 に答える