C 如何确定哪种情况是正确的?

C 如何确定哪种情况是正确的?,c,performance,C,Performance,假设我在if语句中有几个条件: if(x < 0 || x > 10 || x == 5) { } 但是,我希望程序根据哪种情况是真的说些什么。大概是这样的: if(x < 0 || x > 10 || x == 5) { if(x < 0) { printf("your number was less than 0"); } if(x > 10) { printf("your nu

假设我在if语句中有几个条件:

if(x < 0 || x > 10 || x == 5)
{

}
但是,我希望程序根据哪种情况是真的说些什么。大概是这样的:

if(x < 0 || x > 10 || x == 5)
{
    if(x < 0)
    {
        printf("your number was less than 0");
    }

    if(x > 10)
    {
        printf("your number was greater than 10");
    }

    if(x == 5)
    {
        printf("wow, your number is equal to 5!");
    }

    stop(); // PSEUDO CODE
}

这是一种可怕的方法,因为它不必要地检查两次条件;我怎样才能以更有效的方式做同样的事情呢?

为什么要把事情搞复杂?只需拆下外部止回阀,并在两个内部止回阀内放置止动块:

if(x < 0)
{
    printf("your number was less than 0");
    stop();
}

if(x > 10)
{
    printf("your number was greater than 10");
    stop();
}

如果需要,您甚至可以使用else。

将布尔结果保存在变量中,并在变量中重用。有时候冗余是可以的。如果可以减少的话,只需检查/计算执行的次数

bool isXNegative = x < 0;
bool isXMoreThan = x > 10;
bool isXFive = (x == 5);

//for specific conditions
if(isXNegative)
{
    printf("your number was less than 0");
}

if(isXMoreThan)
{
    printf("your number was greater than 10");
}

if(isXFive)
{
    printf("wow, your number is equal to 5!");
}

//for combination of the conditions.
if(isXNegative || isXMoreThan || isXFive)
{
    //common code here for all the conditions.
    stop(); // PSEUDO CODE
}
//else if(another condition combination here...){...}
//else {...}

您可以在失败案例中设置一个标志,然后检查该标志以进行清理

int do_stop = 0;
if(x < 0)
{
    printf("your number was less than 0");
    do_stop = 1;
}

if(x > 10)
{
    printf("your number was greater than 10");
    do_stop = 1;
}

if(x == 5)
{
    printf("wow, your number is equal to 5!");
    do_stop = 1;
}

if (do_stop) {
    stop();
}

假设您确实希望变得复杂,保存一些击键并利用短路,您可以将表达式结果分配给if条件中的变量,如下所示:

  int c1, c2, c3;
  if ((c1 = x < 0) || (c2 = x > 10) || (c3 = x == 5)) {
    if (c1) {
      printf("your number was less than 0\n");
    } else if (c2) {
      printf("your number was greater than 10\n");
    } else {
      printf("wow, your number is equal to 5!\n");
    }
  }
请注意,如果短路条件为x<0,则c2和c3的值未初始化


实际上,我并不提倡用这种方式编写代码,但这种语言功能可能很有用,我没有看到有人提到过它。

如果if语句中有一大堆代码行,甚至更多行或条件,而不是stop,该怎么办?复制和粘贴不是一个错误的决定吗?或者,如果条件不成立,编译器将忽略这些代码行?如果有一堆代码行,则创建一个函数,将所有代码放在其中,然后在两个位置调用它。否则if更好。如果您有或可能有3种以上的情况,则也建议使用开关。编译器可以比其他编译器更好地跟踪类型you@RyanHaining这个话题无关紧要。无论我选择什么编码符号,我的目标都是回答OPs问题。这是另一个故事。我有理由选择在变量前面加前缀。这是一个很长的解释。此外,我也不遵循最佳实践,在互联网上随意发布一些人/文章。我总是根据趋势来评估我的工作/代码。当你回答那些似乎来自初学者的问题时,你的风格会受到更多的批评,所以OP不会认为在他们的胸部前面加上b是一个普遍接受的好主意。在任何社交网络上写任何帖子之前,我都会收到批评。所以这并不困扰我。无论我们选择什么风格,都会有批评者站在另一边,所以不被批评似乎是不可能的事情。比如malloc和new,goto和no goto,politicianA和politicianB,等等,但是是的,你是对的。我想我应该遵循OP的命名方式,这样对他们来说会更容易组合。而且,我在回答中没有提到/强制遵循我的风格,只是,这对我来说是自然而然的。获取信息与否仍取决于任何人的选择。@RyanHaining o-gee,哈哈,我刚刚读了你在第一条评论中的链接。我不用匈牙利语。我们在工作中使用不同的命名变量系统。我想我理解你为什么不鼓励人们使用匈牙利语。但这是他们的选择。让他们选择对他们来说容易的或他们公司选择的。如果x<0 | | x>10 | | x==5,则检查是多余的,不需要。另外,使用else if代替if,比如-if x10{…}else if x==5{…}@H.S.这个检查怎么是多余的?如果没有那张支票,你需要移动停止;进入3个内部if块中的每一个,导致更差的IMHO冗余。@Gerhardh此检查是冗余的,重复检查x-x<0、x>10和x==5,这是不需要的。当然,当我说冗余时,我的意思是有更好的方法来确保只有当这些条件中的任何一个为真时才会调用stop,并且发布的答案已经包括了这些方法。我的意思是,也不是说每个if块中都有callstop,更好的方法是在if块中设置一个标志,只有当该标志为真时才调用stop,有点像下面发布的dbush答案。
  int c1, c2, c3;
  if ((c1 = x < 0) || (c2 = x > 10) || (c3 = x == 5)) {
    if (c1) {
      printf("your number was less than 0\n");
    } else if (c2) {
      printf("your number was greater than 10\n");
    } else {
      printf("wow, your number is equal to 5!\n");
    }
  }