6

if ステートメントでの論理演算子の使用について簡単な質問があります。

現在、x が 5 または 4 または 78 に等しいかどうかをチェックする if ステートメントがあります。

if ((x == 5) || (x == 4) || (x == 78)) {
blah
}

そして、それをすべて次のように要約できるかどうか疑問に思っていました。

if (x == 5 || 4 || 78) {
blah
}

このような基本的な質問で申し訳ありませんが、私はCを学び始めたばかりです.

4

11 に答える 11

10

近道はありませんが、等価演算子を修正する必要があります。

if ((x == 5) || (x == 4) || (x == 78)) {
于 2011-03-16T03:18:40.580 に答える
6

まず、if で等価テストではなく代入を使用しています。最初の方法 (同等性を適切に置き換える) がテストを実行する最良の方法ですが、可能なオプションが多数ある場合は、より良い方法があるかもしれません。2番目の方法はコンパイルされるかもしれませんが、それはあなたが望むことをしません.4と78の両方がtrueに評価され、あなたがしていることは5(5をxに代入した結果)か4か78は本当です。switch ステートメントは、考えられる代替手段の 1 つかもしれません。

switch (x) {
    case 4:
    case 5:
    case 78:
       blah...
       break;
    default:
}
于 2011-03-16T03:22:07.423 に答える
3

ifステートメントのショートカットはありませんが、次のことを検討することをお勧めします。

switch (x)
{
    case 4: 
    case 5:
    case 78:
        /* do stuff */
        break;

    default:
        /* not any of the above... do something different */
}
于 2011-03-16T03:23:34.870 に答える
2

いいえ、できません。平等のテストは==、ではありません=

于 2011-03-16T03:18:20.423 に答える
1

switch@uncle brad は的確ですが、ステートメントと呼ばれるものについて後で学ぶことになるでしょう。ファンキーに見えますが、次のような状況でよく使用されます (変数の複数の可能な値がすべて同じ効果を持つ場合)。

switch (x) {
case 4:
case 5:
case 78:
    // ...
    break;
}

switchステートメントの意味があまり明確でない場合にのみステートメントを使用したい場合もありますが、if最近のほとんどのコンパイラは、どちらの方法でも最適なマシン コードを生成できるほどスマートです。

于 2011-03-16T03:21:47.957 に答える
0

いいえ、Cではこれを行うことはできません。最初のコードサンプルも正しくありません。Cの割り当て( =)と同等性( )には重要な違いがあります。式に記述した場合、これは実際にコンパイルされ、0または1(falseまたはtrue)に評価されてから、の次の部分と論理的にORされます。表現!==x = 5

2番目のコードサンプルも有効なCですが、希望どおりの動作をしません。ステートメントを「(xは5に割り当てられている)またはtrueまたはtrue」と読みます。これは、Cのゼロ以外の値が論理的に真であるためです。したがって、xには値5が含まれ、trueと評価され、if条件がtrueになります。||オペレータが短絡するため、式の残りの部分は重要ではありません。

于 2011-03-16T03:23:58.567 に答える
0

ログインにかかった時間で回答がありましたが、スイッチを使って機能に分解することができます

int isValid(int toCheck) {
   switch(toCheck) {
      case 4:
      case 5:
      case 78: 
         return 1;
      default:
         return 0;
   }
}

次に、確立されたケースに対してintをチェックする必要があるたびに、メソッドを呼び出すだけです。

確かに、この例はかなりばかげていますが、より多くのケースを選択し、繰り返し評価された場合は、このようなことを実行して、コードを単純化して再利用できます。

于 2011-03-16T03:26:29.083 に答える
0

1 つの別の考え: 「ショートカット」はありませんが、多数の数値がある場合は、コードの長さと入力の妥当性を考慮して、それらすべてを配列に入れ、ループ内の配列に対してチェックする方が簡単かもしれません。多くの数値を複数回比較する必要がある場合は、それらを配列に並べ替えて、バイナリ検索を使用します。

ただし、3 つの数字の場合は、「長い」方法で行う必要があります。

于 2011-03-16T03:47:56.397 に答える
0

長いリストの場合は for ループを実行できますが、実際には論理演算子を処理しません:-...

#include <stdio.h>

int forbiddenList[13] = {5, 4, 78, 34, 23, 56, 4, 7, 6, 4, 33, 2333, 0};
int length = 13;

int main() {

  int mysteryNum;

  printf("type a number: ");
  scanf("%d",&mysteryNum);

  int i;
  for (i = 0; i <= length; i ++)
    {

      int target = forbiddenList[i];

      if (mysteryNum == target)
        {
          printf("You have chosen of the forbidden list!\n");
          printf("YOU SHALL NOT PASS!!\n");
        }
    }
  return 0;
}

ええと... Cをやったことがない... C++をやった方がいい...

于 2011-03-16T04:14:33.140 に答える
0
int preconditions[] = { 4,5,78 }; // it should be in most likely order
int i = 0;
for(;i<3;++i) {
   if( x == preconditions[i] ) {
      // code here.
   }
}
于 2011-03-16T04:09:16.370 に答える
0

いいえ、できません。すべての式を書き出す必要があります。比較する数値の非常に長いリストの場合、数値を配列に入れて、リストをループすることができます。しかし、それが良いアイデアのように見えるようになる前に、数十個ほどの数字を用意する必要があります。

于 2011-03-16T03:18:59.423 に答える