6

我有一个关于在 if 语句中使用逻辑运算符的快速问题。

目前我有一个 if 语句来检查 x 是否等于 5 或​​ 4 或 78:

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

首先,您在 ifs 中使用的是分配而不是相等测试。第一种方法(对相等进行适当的替换)是进行测试的最佳方法,但如果您有很多可能的选择,可能会有更好的方法。第二种方法可能会编译,但它不会做你想要的,它总是会返回 true,因为 4 和 78 都评估为 true,而你正在做的是评估 5(将 5 分配给 x 的结果)还是 4 或78个是真的。switch 语句可能是一种可能的选择。

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

@uncle brad 很到位,但稍后您可能会了解一种叫做switch声明的东西。它看起来很时髦,但通常用于这些情况(变量的几个可能值都具有相同的效果):

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

尽管您只想在switch语句的含义if不太清楚时使用语句 - 现在大多数编译器都足够聪明,可以生成最优的机器代码。

于 2011-03-16T03:21:47.957 回答
0

不,对不起,你不能;你必须写出所有的表达式。对于要比较的非常长的数字列表,您可以将数字放入一个数组中,然后循环遍历该列表;但是你必须有十几个数字才能开始看起来像一个好主意。

于 2011-03-16T03:18:59.423 回答
0

不,您不能在 C 中执行此操作。您的第一个代码示例也不正确。=C 中的赋值 ( ) 和等价 ( )之间有一个重要区别==。当您x = 5在表达式中编写时,这实际上将编译并评估为 0 或 1(假或真),然后与下一部分进行逻辑或运算表达方式!

您的第二个代码示例也是有效的 C,但它没有做您希望它做的事情。您将声明读作“(x 分配给 5)或真或真”。这是因为 C 中的任何非零值在逻辑上都是正确的。因此,x 将包含值 5,并评估为真,使您的 if 条件为真。||由于运算符短路,表达式的其余部分无关紧要。

于 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

另一种想法:虽然没有“捷径”,但如果您有很多数字,则代码长度和输入合理性可能会更容易将它们全部放入数组中并在循环中检查数组。如果您必须多次比较多个数字,请将它们排序在一个数组中并使用二进制搜索。

但是,对于 3 个数字,您必须以“很长”的方式进行操作。

于 2011-03-16T03:47:56.397 回答
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

如果它是一个长列表,您可以执行 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 回答