是否可以在同一行中对其进行数学运算时获取变量的地址

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

我正在实现一个 C 函数来处理字符串。

最后我不得不 return 指向静态字符串的指针,但在此之前必须将字符串的第一个元素设置为 '\0'

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

到目前为止一切正常,但后来我想合并最后两行:

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

然后我得到错误"lvalue required as unary ‘&’ operand"。 我认为这是因为编译器威胁括号内的所有内容都是数字,而不是变量,而且我们都知道你不能只有数字的地址("return &('[=25=]');" 是错误的)。

我的问题绝对无关紧要,但我仍然很想知道您是否可以欺骗编译器(在我的例子中是 gcc)将括号中的内容视为变量而不是数字

提前致谢:)

如果你想要这样的复合语句 return 那么只需使用逗号运算符

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

或(即相同)

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

或者您可以将表达式括在括号中。

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

Everything works absolutely fine to this point

是的,到目前为止代码看起来还不错。

but then I wanted to merge the last two lines

为什么?那是没有意义的。

Then I got the error "lvalue required as unary ‘&’ operand". I presume that's so because the compiler threats everithing within the brackets as a number

不是,这是因为编译器将括号内的所有内容都视为 = 运算符的结果。为了获取某物的地址,它必须是一个 lvalue - 分配变量的可寻址内存位置。

C 中的某些运算符 return 结果是左值,有些则不是。 = 运算符没有。来自标准:

An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment, but is not an lvalue.

所以你不应该这样做。保持代码不变,不要更改任何内容:

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

...but still I'm eager to know if you can trick the compiler

嗯,C 允许各种疯狂的事情。但这并不意味着你应该这样做。您不应编写的一些代码示例:

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

return *string = '[=11=]', string;

return &string[*string = '[=11=]'];

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

如果您想合并这两行,请考虑编写一个具有有意义名称的函数,而不是混淆您的代码(或尝试以某种方式 "trick" 编译器)

char *cleared(char *str)
{
    *str = '[=10=]';
    return str;
}

这样你就可以像

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