2010-11-25 276 views
2

我有一個問題,C中的/ +和+之間的區別?

/+和just +之間有什麼區別?

在我的計劃,我有這行代碼

md_addr_t GSharePC = PC >> (PC_ZERO_BITS/* + (int)log2(Tournament_Counters)*/) & (Tournmanet_GShare_PHT_Entries - 1); 

然而,當我去註釋掉它,我不小心留下的第一/像這樣

md_addr_t GSharePC = PC >> (PC_ZERO_BITS/ + (int)log2(Tournament_Counters)) & (Tournmanet_GShare_PHT_Entries - 1); 

它應該只是

md_addr_t GSharePC = PC >> (PC_ZERO_BITS + (int)log2(Tournament_Counters)) & (Tournmanet_GShare_PHT_Entries - 1); 

做/ +和/之間的區別是什麼?它實際上是否分開然後添加?如果是這樣,它會完全分裂嗎?任何澄清將不勝感激。我很感興趣,因爲使用/ +實際上爲我運行的程序產生了更好的結果,然後只是+做了。

回答

7

+既是二元運算符(加法)又是一元運算符(否定的反義詞)。

你的第二個行解析爲

(PC_ZERO_BITS/(+(int)log2(Tournament_Counters))) & (Tournmanet_GShare_PHT_Entries - 1) 
3

在第二種情況下,+用作一元正運算子

+-跡象可以作爲二進制一元運營商根據他們的背景和運算符優先級。

-用於指示負數,+用於指示正​​數。 +使用較少,因爲默認情況下整數字面量爲正數。這樣做:

printf("Hello %d", + 5); 

等同於:

printf("Hello %d", 5); 

這就是爲什麼你的代碼編譯。

1

據我看到它,你沒有刪除評論,這是/* comment */
您只刪除了星號*,並省略了正斜槓/
所以,基本上你現在正在劃分,而現在+(就像其他答案所說的)只是一元。

1

在此:

PC_ZERO_BITS/ + (int)log2(Tournament_Counters) 

+是一元+所以你實際上可以將其刪除。

1

它被視爲(PC_ZERO_BITS)/(+ (int)log2(Tournament_Counters))所以你分而不是+。您可能想了解operators precedence。如果你能解釋「更好」是什麼意思......

3

並非每種語言都有一個一元運算符+,並且在大多數語言中,它是一個無操作符。有時候,它會做一些事情,比如將字符串轉換爲數字,這與"string" + 0在某些語言中的做法大致相同。 Ruby有一個精心設計的解析器,用於分析行尾是否真的是語句結束的標記,所以一個單一的+可能會將語句繼續到另一行。

運算符重載可能是可能的。

但是回到C99,一元運算符+只做了一件事:它應用整數提升。因爲如果在表達式中使用操作數,那麼就會出現這種情況,所以我們假設一元+僅用C來對稱 - 。

由於促銷活動如此普遍適用,因此很難在行動中看到這一點。 我想出了這個:

printf("%zd\n", sizeof((char) 'x')); 
printf("%zd\n", sizeof(+(char) 'x')); 

這(在我的Mac)打印

1 
4 
+0

酷。第一個是char,int是第二個 - 這真的不明顯。 – 2010-12-22 19:17:18