if else shorthand 在 C 中

if else shorthand in C

下面的说法是不是shorthand的一种?我需要有人帮助我理解它。

#define clean_errno()(errno == 0? "None": strerror(errno)) 

从执行结果来看,我猜是说一旦我遇到clean_errno(),如果errno ==0,我把clearn_errno()替换成None,如果不是,我替换clean__errno()strerror(errno)。但我不知道如何从逻辑上分析这句话?

代码在运行时进行评估并遵循 shorthand:

condition ? if_true : if_false

此 shorthand 与常规 if else 语句非常相似。

然而,与 C 中的正常 if else 不同,shorthand 可以用作表达式和语句。即:

char * str = 1 ? "true" : "false";

... 与 if else 配合使用效果不佳(char * str = if ... 可能无效)。

0 ? "true" : "false" 试一试并测试一下。

祝你好运!

预处理器宏在它们的调用站点中被替换

这意味着像

这样的语句
printf("Error = %s\n", clean_errno());

将被替换为

printf("Error = %s\n", (errno == 0? "None": strerror(errno)));

然后在 运行 时间打印 "None" 如果 errno == 0,否则打印 strerror(errno).

的结果

至于?:表达式本身,它是conditional (a.k.a. the ternary) expression,它的作用类似于if-else

但是,我不推荐使用这样的宏,因为如果函数没有失败,errno 的值通常是未定义的。在检查 errno 之前,您需要确保前一个函数确实 did 失败,在这种情况下它永远不会为零。很少有 errno 会被重置为零的地方,除非你事先特别这样做,并且 知道 你调用的函数不会修改它,除非出现错误。