为什么我不能在 C 中使用 `&&a`?
Why can't I use `&&a` in C?
int main(int argc, char * argv[]) {
int a = 10;
int * sp = &a;
int * * dp1 = &sp;
int * * dp2 = &&a; // NG
int * * dp3 = &(&a); // NG
int * * dp4 = &((int *) &a); // NG
}
$ cc test.c
test.c: In function ‘main’:
test.c:6:17: error: lvalue required as unary ‘&’ operand
int * * dp3 = &(&a); // NG
^
test.c:7:17: error: lvalue required as unary ‘&’ operand
int * * dp4 = &((int *) &a); // NG
^
test.c:5:3: error: label ‘a’ used but not defined
int * * dp2 = &&a; // NG
^
&var
给你变量的地址,所以我不知道你期望 &&var
是什么,地址的地址?如果我错了请纠正我。
因为你只能得到一个变量的地址而不是一个值的地址(由 &a 给出)而且 && 是 boolean AND 正如@UnWind 所说。
Why can't I use &&a
因为 &
给你一个变量的地址而 &a
不是一个变量。
C 11 草案规定如下:
6.5.3.2 Address and indirection operators
Constraints
1 The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.
[...]
Semantics
3 The unary & operator yields the address of its operand. [...]
为了解决这个问题 "limitation" 可以使用这样的复合文字引入临时存储(至少假设 C99):
int a = 42;
int ** ppa = &((int *){&a});
作为参考以下错误消息的旁注:
test.c:5:3: error: label ‘a’ used but not defined
int * * dp2 = &&a; // NG
^
gcc(可能还有其他)定义了 C 标准的扩展,如果操作符标识标签,则允许在单个操作符上使用 &&
运算符。 (此处有更多相关信息:https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html)
示例:
void * pv = &&lbl;
goto *pv;
/* some dead code */
lbl:;
/* living code again here */
在每个语句中,这部分:&a
被视为数字值(因为它获取变量的地址)。
因此,对于前两个错误:
error: lvalue required as unary ‘&’ operand
第一个 &
被视为 bitwise AND 运算符,因此它希望在它之前有一个值。 (即 2 & 3
)。
最后一个错误:
error: label ‘a’ used but not defined
是因为有两个&&
所以把a
当作一个标签(见)。
你想要实现的事情(获取地址的地址)是不可能的,因为无法获取"constant value"的地址,因为&a
已经是一个值,只是变量的地址。
int main(int argc, char * argv[]) {
int a = 10;
int * sp = &a;
int * * dp1 = &sp;
int * * dp2 = &&a; // NG
int * * dp3 = &(&a); // NG
int * * dp4 = &((int *) &a); // NG
}
$ cc test.c
test.c: In function ‘main’:
test.c:6:17: error: lvalue required as unary ‘&’ operand
int * * dp3 = &(&a); // NG
^
test.c:7:17: error: lvalue required as unary ‘&’ operand
int * * dp4 = &((int *) &a); // NG
^
test.c:5:3: error: label ‘a’ used but not defined
int * * dp2 = &&a; // NG
^
&var
给你变量的地址,所以我不知道你期望 &&var
是什么,地址的地址?如果我错了请纠正我。
因为你只能得到一个变量的地址而不是一个值的地址(由 &a 给出)而且 && 是 boolean AND 正如@UnWind 所说。
Why can't I use
&&a
因为 &
给你一个变量的地址而 &a
不是一个变量。
C 11 草案规定如下:
6.5.3.2 Address and indirection operators
Constraints
1 The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.
[...]
Semantics
3 The unary & operator yields the address of its operand. [...]
为了解决这个问题 "limitation" 可以使用这样的复合文字引入临时存储(至少假设 C99):
int a = 42;
int ** ppa = &((int *){&a});
作为参考以下错误消息的旁注:
test.c:5:3: error: label ‘a’ used but not defined
int * * dp2 = &&a; // NG
^
gcc(可能还有其他)定义了 C 标准的扩展,如果操作符标识标签,则允许在单个操作符上使用 &&
运算符。 (此处有更多相关信息:https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html)
示例:
void * pv = &&lbl;
goto *pv;
/* some dead code */
lbl:;
/* living code again here */
在每个语句中,这部分:&a
被视为数字值(因为它获取变量的地址)。
因此,对于前两个错误:
error: lvalue required as unary ‘&’ operand
第一个 &
被视为 bitwise AND 运算符,因此它希望在它之前有一个值。 (即 2 & 3
)。
最后一个错误:
error: label ‘a’ used but not defined
是因为有两个&&
所以把a
当作一个标签(见
你想要实现的事情(获取地址的地址)是不可能的,因为无法获取"constant value"的地址,因为&a
已经是一个值,只是变量的地址。