【问题标题】:How can I set an if to check multiple value in C?如何设置 if 以检查 C 中的多个值?
【发布时间】:2015-06-12 10:30:09
【问题描述】:

例如,我想检查以下内容:

if((sample.x == 260 || sample.x == 261) && (sample.y==178 ||sample.y==179 ||) )
{ ...
}

我怎样才能用更简单的方式来表达它?(我必须在 if 条件中放入很多 OR,我应该创建一个函数吗?或者我该怎么说:

if(sample.x == 10 between 20)//Thats my objective here

谢谢!

我正在用 C 编程

【问题讨论】:

    标签: c logic


    【解决方案1】:

    你可以为此制作一个宏。

    // define macro between, you get X<=V && V<=Y
    // X, Y are the limits, V is the variable you are evaluating
    #define between(V, X, Y) ((X)<=(V) && (V)<=(Y))
    

    如果变量 V 在 X 和 Y 之间,则返回 true,否则返回 false。

    那么你就可以把它当作普通函数使用了

    if(between(sample.x, 10, 20) || between(sample.y, 30, 40)) {...}
    

    更多关于宏的信息here

    【讨论】:

    • 请注意,V 在宏中被计算了两次,因此在计算时要注意副作用。
    • 宏在预编译期间没有扩展吗?它并没有在运行时真正评估。我认为唯一的问题是忘记它是一个宏并尝试将其用作常规函数,在这种情况下,他们将在语句末尾缺少分号。
    • 是的,宏在预编译(预处理)期间被扩展。但是,正如宏所指示的那样,该扩展会将作为 V 传入的任何内容两次复制到代码中。如果 V 有副作用(例如x++fwrite(...)),那么程序可能不会像您预期的那样运行。这是因为您编写了一次x++fwrite(...),但该代码执行了两次。
    【解决方案2】:

    这是尝试编写可读代码时的常见问题。如果值自然落入范围内,您可以这样做

    if ((x >= 10 && x < 20) && (y >= 30 && y < 40))
    {
        ...
    }
    

    有时逻辑更复杂。在这种情况下,您可以在 if 语句中使用长表达式,但这对于其他程序员(或您)来说可能难以阅读。我喜欢的一种技术是将条件分解为一系列谓词并在单独的行上计算每个谓词:

    /* get the bool type for readability */
    #include <stdbool.h>
    
    bool x_in_range = (x >= 10 && x < 20) || (x >= 100 && x < 110);
    bool y_in_range = (y >= 30 && y < 40) || (y >= 200 && y < 210);
    
    if (x_in_range && y_in_range)
    {
        ....
    }
    

    这可以使复杂的逻辑更容易理解。像这样的简单记忆表达式应该很容易让编译器优化和生成可比较的代码,以将所有内容都放在 if 语句中。

    最后,如果触发您的 if 语句的条件集非常复杂,您可能希望将它们编码到一个表中,然后编写一个小型引擎来根据表中的数据评估相关变量。这是一种数据驱动的方法。在您的情况下,该表可能包含 x 和 y 变量的一组可接受范围。最好将此表及其评估引擎分解为一个单独的函数。

    【讨论】:

    • C 语言没有'bool'。
    • 如果你#include 就可以了。我编辑了我的答案。
    【解决方案3】:

    您可以只检查一个范围而不是每个单独的值,例如:

    if ((sample.x >= 10 && sample.x <= 20) && (sample.y >= 178 && sample.y <= 200))
    {
        // ...
    }
    

    【讨论】:

    • 非常感谢,成功了,我有类似的东西,但这是正确的形式!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2021-01-28
    • 2015-04-26
    • 2019-03-22
    • 2011-04-08
    相关资源
    最近更新 更多