C – 如何在三元运算符中使用 exit/return 语句?

C – How to use an exit/return statement in ternary operator?

我想用更短的方式表达这两个 if 语句:

//FUNCTION PROTOTYPES
int checkCommandLineArguments(int argc, char *argv[]);
int checkFile(char *argv[]);

//MAIN FUNCTIONxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
int main(int argc, char *argv[])
{
    checkCommandLineArguments(argc, &argv[1]);
    checkFile(&argv[1]);
    return 0;
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx



//F1–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
int checkCommandLineArguments(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./recover image\n");
        exit(1);
    }
    return 0;
}
//–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

//F2–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
int checkFile(char *argv[])
{
    FILE *file = fopen(argv[1], "r");
    if (NULL == file)
    {
        printf("Cannot open file!\n");
        exit(1);
    }
    return 0;
}
//–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

我考虑过使用三元运算符:

(argc != 2) ? printf("Error X\n"), exit(1) : (NULL == file) ? printf("Cannot open file!\n"),
        exit(1): return 0 ;

但是,它似乎不起作用(可能是因为 return/exit 语句)。我该如何解决这个问题,或者是否有任何其他(更合适的)方法可以解决这个问题?

谢谢!

编辑 1 有人评论说三元运算符不适用于语句,因此该选项已关闭 table。 但是,我仍在寻找更好的方法来做到这一点。

编辑 2 我添加了一个更扩展的代码示例,因为它已在评论中被要求。

How to use an exit/return statement in ternary operator?

你不能。三元运算符的第二个和第三个操作数必须是表达式,并且 return 语句 不是表达式(请参阅 Ternary operators and Return in C)。但是,允许两者都是 void 表达式,例如 exit(1),在这种情况下,运算结果也是 void 表达式。

此外,对于您的特定代码,逗号运算符 (,) 在所有 C 运算符中的优先级最低。因此,如果您打算在任何其他操作中使用逗号表达式作为操作数,则需要将其括起来。

I wanted to formulate these two if statements in a shorter way:

为什么?仅仅简洁或简洁是没有用的 objective。如果它让你的代码难以阅读和理解,那么让你的代码更短就是一种责任。

但是如果你的意思是你想表达同样的事情更多简单,更多清楚,和/或更少 redundantly,那么这会引导你找到那些恰好也更短的表格。例如,您可以将逻辑封装在函数或宏中。我个人经常提供一个看起来像这样的宏:

#define ERROR_IF_NZ(cond, message) do { \
    if (cond) { \
        fputs(message, stderr); \
        exit(1); \
    } \
} while (0)

使用它,您的代码可能如下所示:

ERROR_IF_NZ(argc != 2, "Error X\n");
ERROR_IF_NZ(NULL == file, "Cannot open file!\n");

调整宏名称,使其对您来说最有意义,然后看!它不仅比原始代码更清晰,而且更短,即使你算上宏定义的长度。

更新

对问题的编辑几乎已经提出了这个答案。如果您已经拥有与此处描述的宏具有相同作用的函数,那么只需调用它们即可。用三元表达式替换函数和对它们的调用没有赎回价值,也不值得将您拥有的函数转换为宏。当然,减少源代码大小并不是进行此类更改的合理动机。

您通过编辑添加的代码是可读的并且或多或少没有问题,您不需要使用三元运算符技巧来混淆它。

只有 checkFile 是毫无意义的,你打开文件然后退出函数而不对文件做任何事情并最终泄漏文件句柄。

您可能想要这种模式:

int main(int argc, char *argv[])
{
    checkCommandLineArguments(argc, &argv[1]);
    FILE *file = checkFile(&argv[1]);

    // do stuff with file

    fclose(file);
    return 0;
}

FILE *checkFile(char *argv[])
{
    FILE *file = fopen(argv[1], "r");
    if (NULL == file)
    {
        printf("Cannot open file!\n");
        exit(1);
    }
    return file;
}