“如何写作”;如果x等于5或4或78或……“;在C中

“如何写作”;如果x等于5或4或78或……“;在C中,c,if-statement,logical-operators,C,If Statement,Logical Operators,我有一个关于在if语句中使用逻辑运算符的快速问题 目前我有一个if语句,它检查x是否等于5、4或78: if ((x == 5) || (x == 4) || (x == 78)) { blah } 我想知道我是否可以把这些浓缩成: if (x == 5 || 4 || 78) { blah } 很抱歉问了这么一个基本的问题,我刚刚开始学习C。不,你不能,相等性测试是=,而不是=没有捷径,但你需要修复相等运算符 if ((x == 5) || (x == 4) || (x == 78)) {

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

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

if ((x == 5) || (x == 4) || (x == 78)) {
blah
}
我想知道我是否可以把这些浓缩成:

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

很抱歉问了这么一个基本的问题,我刚刚开始学习C。

不,你不能,相等性测试是
=
,而不是
=
没有捷径,但你需要修复相等运算符

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

不,对不起,你不能;你必须把所有的表达式都写出来。对于要比较的非常长的数字列表,您可以将这些数字放入一个数组中,并在列表上循环;但是,在这看起来是个好主意之前,你必须有十几个数字。

@布拉德叔叔很在行,但稍后你可能会了解一种叫做
开关的语句。它看起来很时髦,但通常用于此类情况(一个变量的几个可能值都具有相同的效果):


尽管您只希望在
if
语句的含义不太清楚时使用
switch
语句,但现在大多数编译器都足够聪明,可以以任意一种方式生成最佳的机器代码。

首先,您在ifs中使用的是赋值而不是相等测试。第一种方法(使用适当的相等替换)是进行测试的最佳方法,不过如果您有很多可能的选择,可能会有更好的方法。第二种方法可能会编译,但它不会执行您想要的操作,它将始终返回true,因为4和78都计算为true,您所做的是计算5(将5分配给x的结果)或4或78是否为true。switch语句可能是一种可能的替代方法

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

if语句没有捷径,但我建议考虑:

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

    default:
        /* not any of the above... do something different */
}

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


您的第二个代码示例也是有效的C,但它并没有实现您希望它实现的功能。您将该语句解读为“(x被指定为5)或true或true”。这是因为C中的任何非零值在逻辑上都是真的。因此,x将包含值5,并计算为true,从而使if条件为true。表达式的其余部分无关紧要,因为
|
操作员短路。

在我登录时,它已经得到了回答,但您可以使用开关,并将其转换为一个函数

int isValid(int toCheck) {
   switch(toCheck) {
      case 4:
      case 5:
      case 78: 
         return 1;
      default:
         return 0;
   }
}
然后,您只需在每次需要根据已建立的案例检查int时调用该方法


诚然,这个例子相当愚蠢,但是对于更大范围的案例选择和反复评估的案例,您可以这样做来简化和重用一些代码。

另一种想法是:虽然没有“捷径”,如果您有很多数字,那么对于代码长度和输入sanity来说,将它们全部放入一个数组并在循环中对照数组进行检查可能会更容易。如果您必须多次与多个数字进行比较,请将它们按数组排序并使用二进制搜索

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

int预条件[]={4,5,78};//这应该是最有可能的顺序
int i=0;

for(;i如果是一个很长的列表,您可以执行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;
}
#包括
int禁止列表[13]={5,4,78,34,23,56,4,7,6,4,33,2333,0};
整数长度=13;
int main(){
内特迈斯特林;
printf(“键入一个数字:”);
scanf(“%d”和mysteryNum);
int i;

对于(i=0;i@stockoverflow,不,你不能这样做。你必须检查一个条件与另一个条件,并将它们与or
|
运算符连接。而且你的
=
必须是
=
。COBOL有这样的快捷方式。但我认为你不想去那里。哈哈,是的,我当然不想。我们的讲师只允许我们使用simp。)因为每个人都是C开头,所以有条件的东西。为什么C中不允许使用这种快捷方式?您不能使用这种快捷方式,因为它在您编写时是完全有效的C代码(忽略“blah”部分)。它只是没有做你认为它应该做的。@stockoverflow-可能是因为它会使编写初始C编译器变得非常复杂。而且运算符的前置将更难正确地使这样的语句工作。在C的优先规则下
x==4 | | 5
解析为
(x==4)||5
,而您建议的快捷方式将要求它解析为
x==(4 | 5)
,这将需要其他可能更常见的操作(如
x==0 | y==0
)为了使用更多的括号。干杯,我们还不允许在课堂上使用数组,但是谢谢你的提示。看起来更简单,迫不及待地想进入高级课程,谢谢你的提示。@stockoverflow开关语句远不是高级课程。而且,没有人指出,
x==5 | | 4 | | 78
是一个完全有效的C统计在C语言中,任何表达式都可以在布尔上下文中使用;如果非零,则表示true;如果为零,则表示false。
4
为非零,因此表达式始终为true。你应该为自己准备一本好的C语言书,通读一遍,并做所有练习(其中应包括以下问题“x==5 | | 4
?”的值是多少,然后问一些书中没有涉及的问题。那一定是C^2,C的下一个级数,在这里你可以使用
布尔值作为一个类型。;p我也看不出有理由将其重构为函数(也不是一个好的重构),但我不会投你反对票。我已经6年没用C了
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.
   }
}
#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;
}