簡體   English   中英

是否可以使用三元運算符“?”來填充C / C ++中的數組列表?

[英]Is it possible to use the ternary operator “?” to fill an array list in C/C++?

這可能是一個愚蠢的問題。 我正在修改由其他人開發的代碼。 我需要根據邏輯變量ThreeDim一些字符數組的值。 我試圖這樣做沒有成功。

int         VarNumber  = ThreeDim==1 ? 3 : 2;
const char* VarList [] = ThreeDim==1 ? {"X","Y","Z"} : {"X","Y"};

但編譯器給我的錯誤就像

error: expected ‘;’ before ‘}’ token
error: initializer fails to determine size of ‘VarList’

由於下游要求, VarList需要是一個const char* 它的大小應該是VarNumber 謝謝

我不認為你可以用不同大小的數組初始化器來做到這一點。 但是,您可以在初始化程序中放置條件表達式:

const char* VarList [] = {"X", "Y", ThreeDim == 1 ? "Z" : nullptr};

這總是會給你一個3元素數組,最后一個元素是“Z”或空指針。

不,因為例如{"X","Y","Z"}不是表達式 它由編譯器專門處理變量定義。

如果你正在編程C ++,你應該使用std::vectorstd::string ,那么它會非常簡單(但是冗長):

std::vector<std::string> VarList = ThreeDim==1 ?
    std::vector<std::string>{{"X","Y","Z"}} : 
    std::vector<std::string>{{"X","Y"}};

您可以考慮使用預處理器#define THREE_DIM ,然后使用#ifdef選擇要編譯的一個或另一個代碼:

#define THREE_DIM

#ifdef THREE_DIM
int         VarNumber  = 3;
const char* VarList [] = {"X","Y","Z"};
#else
int         VarNumber  = 2;
const char* VarList [] = {"X","Y"};
#endif

根據C11 6.7.9,數組不是用表達式初始化,而是用初始化列表初始化 ; 這些是兩種不同的句法元素,不能混合使用。 這是因為數組不可分配,因此將一個數據視為一個值(而不是一個衰減為指針的值)因此沒有意義。 由於它們不是值,因此無法創建繞過整個數組的合法表達式。

與您要求的最接近的直接類比是:

const char** VarList = ThreeDim==1 ? (const char*[]){"X","Y","Z"} : (const char*[]){"X","Y"};

...但這是以更改VarList類型為VarList ,可能不是你想要的。

暫無
暫無

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

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