簡體   English   中英

是什么類型的操作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM