C 如何根据多个值测试函数的返回值,而不将其存储到变量中

C 如何根据多个值测试函数的返回值,而不将其存储到变量中,c,conditional-statements,C,Conditional Statements,我怎样才能实现这样的目标 int main(void) { if (f(x) == (a || b)) { puts("Success"); } return (0); } 如果f(x)的返回值等于a或b,则将打印成功。 我知道可以将其存储在变量中,但我的问题是: “在不使用变量的情况下,只调用一次f(x)函数是否可以实现类似的操作?” 编辑1:我不允许为此作业使用switch语句 编辑2:我可以用这样一个表达式设置一个范围吗 if ( 2 < f(x) <

我怎样才能实现这样的目标

int main(void)
{
  if (f(x) == (a || b))
  {
     puts("Success");
  }
  return (0);
}
如果f(x)的返回值等于a或b,则将打印成功。 我知道可以将其存储在变量中,但我的问题是: “在不使用变量的情况下,只调用一次f(x)函数是否可以实现类似的操作?”

编辑1:我不允许为此作业使用switch语句

编辑2:我可以用这样一个表达式设置一个范围吗

if ( 2 < f(x) < 5)
if(2

这是否有效(返回类型为int)?

这显然可以使用switch语句来完成。另一种方法是使用第一个函数值作为输入调用返回true或false的函数,另一种方法可以是跳转表,甚至是
,或者根据a和b值使用二进制运算符进行位检查(一次测试多个位标志非常常见)

但实际上,在这种情况下,您不应该关心是否使用变量。当前的编译器很擅长将这样的临时变量放入寄存器中

编辑:考虑到约束条件,最有可能的解决方案是使用一些位fu,但它完全取决于a、b和c等的值。常用的方法是使用两个值的幂来检查。然后,您可以仅在一次操作中检查一组值

例:a=1,b=2,c=4

if (f(x) & (1+2+4)) {...}
检查是否有a、b、c或这些值的叠加

如何测试一次调用的函数的多个返回值,而不将其存储到变量(?)

不是真的,但是有一些限制,让我们滥用C并假设
a,b
f()
返回一个字符

1形成由
a
b
组成的字符数组,并使用
memchr()
进行搜索。受启发(它不将
f()
的结果存储在变量中,而是调用函数)


我看到OP增加了“返回类型为int”-哦,好吧


if(2
是有效的代码,但不是OP想要的

这就像
if((2
f(x)
与2进行比较,结果是0或1,这总是小于5


今晚,下面的节目怎么样。对于
int
overflow`,需要一点扩展数学,但很接近

abs(2*f(x) - (a+b)) == abs(a-b)


1针对生产代码的不严重代码建议-使用临时代码。

C语言不支持此类构造。您需要保存函数的结果或/和
a
b

当然,你可以:

int compare(int a, int b, int f)
{
    if(a == f || b == f) { puts("Success"); return 0;}
    return -1;
}

int f(int x)
{
    return x * x;;
}

int main()
{
    compare(5,8,f(3));
}

当然,它会将所有的值保存为函数参数。

switch(f(x)){case'a':…case'b':…}
参见
sscanf的使用示例(在分隔所有值的标题下)您还可以编写一个辅助函数:
int is_a_或_b(int x){return(x==a)|(x==b)}。。。如果(是a_或b(f(x)){…}
感谢您的快速响应,但不幸的是我不允许使用switch语句OK,那么如果返回的是type
char
(或
int
),那么使用
if(strchr(“ab”,f(x))put(“Success”)
如果更多的C滥用,代码可以从
f()开始*0x100000000 u
但问题是,即使有可能,如果没有一个简单的临时变量,我也看不到一个干净的方法。我们至少可以让它变得有趣,并且
srand(time(NULL));
then
if(memchr(“ab”,f(rand()),2))put(“Success”);else put(“Failure”);
where
intf(intx){返回x%3+'a'}
----
:)
memchr((char[2]){a,b},f(x),2)
看在上帝的份上,你为什么会提出这样的建议……………..@Marco Bonelli为什么,因为尽管不实用,但看看一个人能走多远很有趣。abs(2*f(x)-(a+b))==abs(a-b)
怎么样?使用
long-long
扩展来处理溢出,这可能会起作用。但这一切都在你心里。这是一个编程帮助问答网站,不是一个代码高尔夫或混淆挑战。。。“虽然我也觉得这很有趣,但我认为你应该明确这不是一个严肃的回答。”马可博内利说。我想“让我们滥用C”已经足够暗示“不是一个严肃的答案”。也许太微妙了。
int compare(int a, int b, int f)
{
    if(a == f || b == f) { puts("Success"); return 0;}
    return -1;
}

int f(int x)
{
    return x * x;;
}

int main()
{
    compare(5,8,f(3));
}