是否可以在同一行中对其进行数学运算时获取变量的地址
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);
}
我正在实现一个 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);
}