ArLi2003(阿利 路过.NET)
>>>就是或运算,微软的常数通常是以位1 其它为0为标准,所以| 时可以+ 一样的效果
大部分枚举常量确实如此。不过"|"与"+"概念完全不一样。不能误导啊!就算严格满足你说的条件,也不是一样的效果,如:1|1=1,而1+1=2;再如:4|4=4;而4+4=8;他们都是1位为1,就象微软的枚举常量一样,但"位或"与相加不一样啊!
再"Or"或"||"一般是表示逻辑"或",同"|"也不是一回事。
>>>就是或运算,微软的常数通常是以位1 其它为0为标准,所以| 时可以+ 一样的效果
大部分枚举常量确实如此。不过"|"与"+"概念完全不一样。不能误导啊!就算严格满足你说的条件,也不是一样的效果,如:1|1=1,而1+1=2;再如:4|4=4;而4+4=8;他们都是1位为1,就象微软的枚举常量一样,但"位或"与相加不一样啊!
再"Or"或"||"一般是表示逻辑"或",同"|"也不是一回事。
skykevin(天下)
和
jjcccc()
4:二进制为:00000100,但00000100|00000100 与 00000100+00000100一样吗?
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));其实就是 this.dateTimePicker1.Anchor = ((((System.Windows.Forms.AnchorStyles) 1|2)|4)|8);System.Windows.Forms.AnchorStyles. 的 top 是1,2进制为 0001
的Bottom是2,2进制为 0010
left是4,2进制为 0100
right是8,2进制为 1000所以它们的| 和+ 是一样的,至于说的 00100 和 00100 这种二个相同的常数相和是不存在的,因为我上面已经说了,微软的常数都是以单个位为1其它都为0
this.textBox1.Anchor = (System.Windows.Forms.AnchorStyles)(1+2+4+8);是一样的,因为微软的常数是不可能有任何一个BIT 是与同应用域的其它常数相同的(某个bit 不可能同时为1)这就是为什么2之后是4之后又是8 的原因,这是它的一个规则
在微软的标准常数上是相等的==》
this.textBox1.Anchor = (System.Windows.Forms.AnchorStyles)(1|1|1|1);this.textBox1.Anchor = (System.Windows.Forms.AnchorStyles)(1+1+1=1);
一样吗?不信作个Form试试。
当然一般情况下绝对不会这么用,但用来作例子足以说明在C,C++,C#语言里,"|"和"+"绝对不一样。只不过在某些情况下(如你说微软标准常数,那是因为你每个参数都不一样,也就是说没有两个参数在同一位上都视"1")碰巧运算结果一样罢了。就比方数学上2+2=4;8-4=4,总不能说"+"和"-"是一样的效果罢?
总之,"|"和"+"是任何时候都绝对不是一回事。要不你比较两个运算符反汇编后的汇编码看看,就知道真正的区别在哪了!
this.textBox1.Anchor = (System.Windows.Forms.AnchorStyles)(1+1+1=1);应该是
this.textBox1.Anchor = (System.Windows.Forms.AnchorStyles)(1+1+1+1);
则 left 必须是4 以上而不能是3或1或2(因为会有bit 相同是会与和运算冲突),right也必须是8 而不能是5或7 这样的,不知你明白没有从事高级编程的朋友是会不理解,慢慢就会接触到了
this.dateTimePicker1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Top)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Left)));
大概没有人(包括c#编译器)规定不允许这么做吧!
问题越辩越名,不好意思,犯一次戒:
>>>更不可能有 0001|0001 这样的 。。
那只是在正确的情况下,你不会这么写,但不是说不允许这么写。比如无意中写错了代码总是有。
诚心对ArLi2003说一句。你的理解确实有一点小湾没有转过来。若这样,估计写程序的时候,可能容易出些许逻辑上的错误,就是编译和允许都没有问题,但就是得不到自己要的结果。而一旦程序这种错误,还特别难查,所以训练一下严密性没有坏处。
不妥之处,请谅解!
而如果你是习惯于 top|top = 2 它就还是原意top,就不会出错了这就是为什么用| 而不用+ 的原因
{
flags |= newFlag;
}对比:void EnsureFlag(ref int flags, int newFlag)
{
flags += newFlag;
}两者在运行时绝对是有天壤之别!我想如果你在程序中写+=的话,甭说高级程序员,恐怕连最初级的程序员都不会让你做的。另外,关于你所说的“微软的常数规则”其实只是一种简单的现象而已,而且你对这个现象的观察可能还不够仔细,事实上微软也定义了一些非独位的常数,这些常数用于表示一些常见的组合,如XXX_DEFAULT,他可能等于XXX_FLAG1|XXX_FLAG2。这时候你写XXX_DEFAULT|XXX_FLAG1肯定是没错的,然而你写XXX_DEFAULT+XXX_FLAG1肯定就有问题了(编译没问题不等于程序没问题)!总之,|与+绝对是两码事,决不能因为在某些特定的情况下两者可以有相同的答案就认为他们可以相互替换,这绝对是一个严重的问题!技术上的事情容不得半点马虎的!如有得罪还请原谅——为了大多数人对真理的正确理解吧!谢谢:)
再可以说更更彻底,那就要说道数字逻辑电路了,哈哈。
//权限字枚举类型
[Flags]
public enum RightWordEnum
{
NdaSetting = 0X00000001,
Measure = 0X00000002,
SaveData = 0X00000004,
ViewData = 0X00000008,
ModifyData = 0X00000010,
BackupData = 0X00000040,
Template = 0X00000100,
User = 0X00001000,
SurveyPoint = 0X00010000,
}