簡體   English   中英

在同一行中進行數學運算時是否可以獲取變量的地址

[英]Is it possible to get the address of a variable while doing mathematical operations with it in the same line

我正在實現 C function 來操作字符串。

最后,我必須返回指向 static 字符串的指針,但在此之前必須將字符串的第一個元素設置為 '\0'

char *funct(...)
{
    static char string[30];
    .
    . //do some manipulations and possibly return here
    .
    string[0] = '\0';
    return string;
}

到目前為止一切正常,但后來我想合並最后兩行:

char *funct(...)
{
    static char string[30];
    .
    . //do some manipulations and possibly return here
    .
    return &(string[0] = '\0');
}

然后我得到錯誤“需要左值作為一元'&'操作數”。 我認為是這樣,因為編譯器將括號內的所有內容威脅為數字,而不是變量,而且我們都知道你不能只擁有數字的地址(“return &('\0');”是錯誤的)。

我的問題絕對無關緊要,但我仍然很想知道您是否可以欺騙編譯器(在我的情況下為 gcc)將括號中的內容視為變量而不是數字

提前致謝:)

到目前為止一切正常

是的,到目前為止,代碼看起來還不錯。

但后來我想合並最后兩行

為什么? 那是沒有意義的。

然后我得到錯誤“需要左值作為一元'&'操作數”。 我認為是這樣,因為編譯器威脅括號內的所有內容作為數字

不,這是因為編譯器將括號內的所有內容視為=運算符的結果。 為了獲取某物的地址,它必須是一個左值- 一個分配變量的可尋址 memory 位置。

C 中的一些運算符返回一個左值結果,有些則不返回。 =運算符沒有。 從標准:

賦值運算符將值存儲在左操作數指定的 object 中。 賦值表達式在賦值后具有左操作數的值,但不是左值。

所以你不應該這樣做。 保持代碼不變,不要更改任何內容:

string[0] = '\0';
return string;

...但我仍然很想知道你是否可以欺騙編譯器

嗯,C 允許各種瘋狂的東西。 但這並不意味着你應該這樣做。 您不應該編寫的一些代碼示例:

// BAD, OBFUSCATED CODE, DON'T USE THESE

return *string = '\0', string;

return &string[*string = '\0'];

return &(0<:string:>=0)<:string:>;

如果您想要這樣的復合返回語句,那么只需使用逗號運算符

return string[0] = '\0', &string[0];

或者(也一樣)

return string[0] = '\0', string;

或者,您可以將表達式括在括號中。

return ( string[0] = '\0', string );

如果您想合並這兩行,請考慮使用有意義的名稱編寫 function,而不是混淆您的代碼(或嘗試以某種方式“欺騙”編譯器)

char *cleared(char *str)
{
    *str = '\0';
    return str;
}

這樣你就可以像使用它一樣

char *funct(/*...*/)
{
    static char string[30];
    /*
        do some manipulations and possibly return here
    */
    return cleared(string);
}

暫無
暫無

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

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