我如何 return c 中的第一个非空值?

How do I return the first non-null value in c?

在JavaScript中,这样的表达式0 || "Hello World" returns "Hello World".

但是在 C 中,它是 1。 OR 运算符 returns 一个 int,而不是实际值。我需要返回值。

如何获取值而不是布尔值?

我不想在处理像这样的逻辑蛇 foo() || bar() || tar() || mar() || far() 时写一些带有一些可怕声明的 if else 东西。好吧,如果这是唯一的解决方案,那么我将跳回 VBA 或 VimScript 从头开始​​重写编译器,以便它支持该功能。或者直接将二进制值写入 CPU,我不在乎。


请首先查看下面的“代码”,并尝试理解它的作用。

我在下面的这段代码中尝试过,但出现错误

test.c:16:16: warning: return makes pointer from integer without a cast [-Wint-conversion]

这是错误发生的地方,因为 functino 需要一个指针,但 OR 运算符 returns 是一个整数。

return foo() || bee();

代码

#include <stdio.h>
#include <stdlib.h>

char* foo()
{
  return NULL;
}

char* bee()
{
  return "I don't like you, short guy!";
}

char* choice()
{
  return foo() || bee();
}

int main()
{
  char* result = choice();
  
  if(result == NULL) {
     printf("GOt a null again");
     return 1;
  }

  printf("Horray! Succsex!");
  return 0;
}

C 没有 JavaScript 具有的功能。 ||运算符将始终 return 一个 bool 而不是其他类型。我建议简单地写出来:

const char* choice() {
    const char* foo_string = foo();
    if (foo_string) {
        return foo_string;
    } else {
        return bee();
    }
}

此外,您可能已经注意到我将 char* 更改为 const char*,当您像在 bee() 函数中那样使用字符串文字时应该这样做。

你想做的,可以通过这个实现,

char* choice() {
    char* ch = foo();
    if(ch) { // check if it is not NULL, then return that ptr
        return ch;
    }
    return bee(); // if foo() returned NULL, return the output of bee()
}

两种完全不同的语言不可能总是有相似的语法。它们在一种语言中可能很简单,但在另一种语言中需要更多的努力。

解决方案 1.

使用辅助变量:

char *res = NULL;
(res = foo()) || (res = bar()) || (res = tar()) || ...;
return res;

请注意,当人们期望使用相等运算符时,就会使用赋值运算符。额外的括号用于消除有关使用 = 的警告。

解决方案 2.

假设您使用 GCC 或 CLANG 编译器,您可以使用以下 extension。这让您可以通过省略运算符的第二个参数,将条件值用作条件运算符的 return 值:

char* choice()
{
  return foo() ?: bee(); // add ?: tar() ?: mar() ?: ...
}

这正是您要找的。