【发布时间】:2021-02-13 04:10:18
【问题描述】:
我想用更短的方式来表述这两个 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 ;
但是,它似乎不起作用(可能是因为返回/退出语句)。我该如何解决这个问题,或者有任何其他(更合适的)方法可以做到这一点?
谢谢!
编辑 1 有人评论说三元运算符不适用于语句,因此该选项不在讨论范围内。 但是,我仍在寻找更好的方法来做到这一点。
编辑 2 我添加了一个更扩展的代码示例,因为它已在 cmets 中被要求。
【问题讨论】:
-
最好不要尝试将难以阅读的代码塞进一行。一种方法是创建自己的
myexit(char *reason)函数,然后可以将代码缩短为if (NULL == file) myexit("Cannot open file!");(两行)。 -
您是否认为它使您的代码更具可读性或效率?不,不是。
-
这能回答你的问题吗? Ternary operators and Return in C 简短回答:你不能,但是你可以返回一个三元表达式。无论如何,两个嵌套的三元运算符,逗号运算符......你可能认为这很酷,但事实并非如此。编写干净的代码,这是很酷的代码。
-
不推荐,这是有效的:
int cond = 1; cond ? (void)puts("hello") : exit(1);(同时表达真假void) -
@dtell 我也会接受“哇,读起来像 Perl”。
标签: c conditional-statements conditional-operator