[英]Is typecasting a unary operation?
在C中,是否將變量/值類型轉換為一元運算?
要添加到這個是類型化整數值(可能在你應用掩碼之前)也是一元操作? 讓我說我有
((uint64_t)1 << 30 & 0xFFFF0000FFFF0000LL)
1填充零(最多64位),然后移位?
邏輯上,是的,將它視為一元運算符是合理的,因為它需要一個操作數。
但是如果你看一下C標准對表達式進行分類的方式,第6.5.3節將介紹一元運算符,並在第6.5.4節中單獨描述了強制運算符。
實際上至少有一種區別很重要。
sizeof
單目expresson
是一元表達的幾種形式之一。 如果一個強制轉換操作符(type-name)
被視為像其他操作符一樣的一元運算符,那么:
sizeof (int) 42
將是一個有效的一元表達式: 42
將是轉換運算符的操作數,而操作數又是一元運算符sizeof
的操作數。 但實際上這是一個語法錯誤(因為sizeof (int)
本身就是一個有效的表達式)。 為了避免這個問題,一元運算符和強制轉換運算符是分開定義的(實際上給出了不同的優先級)。 要在避免語法錯誤的同時編寫上述內容,您需要添加括號:
sizeof ((int) 42)
參考: N1570,2011 ISO C標准的最新免費草案。
作為一元運算符只不過只有一個參數。 type參數不作為參數,因此轉換運算符是一元的。
您的第二個問題與運營商優先級有關。 強制轉換具有與其他一元運算符相同的優先級,高於移位<<
,而高於二進制和&
。
所以你的代碼相當於:
((((uint64_t)1) << 30) & 0xFFFF0000FFFF0000LL)
C標准沒有具體談到“一元操作”。 他們有“一元運算符”(“-ors”vs“-ions”),而演員不屬於前者,因為它們是單獨列出的。
然而,在數學上,它們絕對是一元的:它們有一個輸入和一個輸出。
你的問題似乎不是關於術語 ,而是關於綁定 :是的
(uint64_t)1 << 30
綁定為:
((uint64_t)1) << 30
例如,然后執行所有綁定在一起的操作,以便將&
操作應用於其結果。 答案是肯定的,他們這樣做。 雖然標准不使用運算符優先級語法,但您可以從標准語法中派生出一個,而在這樣的語法中,強制轉換運算符和一元運算符的優先級高於移位運算符,后者的優先級高於按位運算符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.