我如何 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() ?: ...
}
这正是您要找的。
在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() ?: ...
}
这正是您要找的。