C – 如何在三元运算符中使用退出/返回语句?



我想用更简短的方式表述这两个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 imagen");
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 Xn"), exit(1) : (NULL == file) ? printf("Cannot open file!n"),
exit(1): return 0 ;

但是,它似乎不起作用(可能是因为返回/退出语句)。我该如何解决这个问题,或者还有其他(更合适)的方法可以做到这一点吗?

谢谢!

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

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

如何在三元运算符中使用退出/返回语句?

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

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

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

为什么? 简明扼要不是一个有用的目标。 如果它使你的代码难以被人类阅读和理解,那么让你的代码更短是一种负担。

但是,如果你的意思是你想更简单、清晰和/或更少冗余地表达同样的事情,那么这可以引导你走向恰好更短的形式。 例如,可以将逻辑封装在函数或宏中。 就个人而言,我经常提供一个看起来像这样的宏:

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

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

ERROR_IF_NZ(argc != 2, "Error Xn");
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;
}

最新更新