簡體   English   中英

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

[英]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有人評論說三元運算符不適用於語句,因此該選項不在表中。 但是,我仍在尋找更好的方法來做到這一點。

編輯 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 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM