2014-11-03 95 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