2014-11-03 62 views
0

此:地址运算符 “&” 与函数返回

bit_is_set(optos(),opt) 

扩大宏观bit_is_set:

((*(volatile uint8_t *)(((uint16_t) &(optos())))) & (1 << (opt))) 

不工作,并显示错误消息:需要左值作为一元 '&' 操作数。

但这:

uint8_t a=optos(); 
bit_is_set(a,opt) 

工作正常。

为什么?

如何使用带函数返回的地址运算符“&”?

+1

'optos()'返回一个值,而不是一个对象。值没有地址。 – pmg 2014-11-03 19:40:55

+0

'&'是*地址*操作符,而不是方向操作符。你可能认为“方向”与“间接”相反,但这并不常见。 – 2014-11-03 19:48:27

+0

感谢您的澄清。 :-) – chuy 2014-11-03 19:56:06

回答

2

出于同样的原因,这是行不通的:

uint8_t optos() { 
    return 4; 
} 

int main(void) { 
    uint8_t* addr = &optos(); 
    return 0; 
} 

error: lvalue required as unary ‘&’ operand

&操作需要一个左值返回的地址。一个临时右值(在你的情况下,从optos()返回的值)不能得到它的地址,并且需要首先绑定到一个左值。

+0

好的。 铸造optos()返回的生成或不是临时左值? (uint8_t)(optos()) – chuy 2014-11-03 20:05:31

+0

无法正常工作,将它用作'uint8_t a = optos();'时会出现什么问题? – 2014-11-03 20:07:14

+0

任何,根本没有做明确的变量声明。这就是全部。 谢谢。 – chuy 2014-11-03 20:13:47

相关问题