2010-11-25 378 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