如何设置 if 以检查 C 中的多个值?
How can I set an if to check multiple value in C?
例如我想检查以下内容:
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 编程
您可以只检查一个范围而不是每个单独的值,例如:
if ((sample.x >= 10 && sample.x <= 20) && (sample.y >= 178 && sample.y <= 200))
{
// ...
}
这是尝试编写可读代码时的常见问题。如果值自然落在范围内,你可以这样做
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 语句的条件集非常复杂,您可能希望将它们编码为 table,然后编写一个小型引擎来根据中的数据评估相关变量table。这是一种数据驱动的方法。在您的情况下,table 可能包含一组 x 和 y 变量的 acceptable 范围。这个 table 及其评估引擎最好分解成一个单独的函数。
您可以为此制作一个宏。
// 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 之间,则此 returns 为真,否则为假。
然后你就可以把它当作一个普通函数来使用了
if(between(sample.x, 10, 20) || between(sample.y, 30, 40)) {...}
有关宏的详细信息here
例如我想检查以下内容:
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 编程
您可以只检查一个范围而不是每个单独的值,例如:
if ((sample.x >= 10 && sample.x <= 20) && (sample.y >= 178 && sample.y <= 200))
{
// ...
}
这是尝试编写可读代码时的常见问题。如果值自然落在范围内,你可以这样做
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 语句的条件集非常复杂,您可能希望将它们编码为 table,然后编写一个小型引擎来根据中的数据评估相关变量table。这是一种数据驱动的方法。在您的情况下,table 可能包含一组 x 和 y 变量的 acceptable 范围。这个 table 及其评估引擎最好分解成一个单独的函数。
您可以为此制作一个宏。
// 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 之间,则此 returns 为真,否则为假。
然后你就可以把它当作一个普通函数来使用了
if(between(sample.x, 10, 20) || between(sample.y, 30, 40)) {...}
有关宏的详细信息here