[英]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.