代码之家  ›  专栏  ›  技术社区  ›  Jake Petroules

相当于Visual Basic的和和或在C?

  •  7
  • Jake Petroules  · 技术社区  · 14 年前

    我知道 AndAlso 等于 && OrElse 等于 || . 但是 最干净的方法是什么? Visual Basic的 And Or 在C?

    例如,考虑下面的vb.net代码。这个 ValidateForControl 方法执行一些验证,并返回指定控件的状态是否有效。如果所有控件都有效,则整个输入窗体都有效。但是,每个控制必须单独验证,即使其中一个无效(这要求操作员不要短路)。Visual Basic的 操作员非常适合这种情况,但不幸的是,据我所知,在C中没有等价的操作员( && 短路)。

    Return _
        Me.ValidateForControl(Me.firstNameTextBox) And
        Me.ValidateForControl(Me.middleNameTextBox) And
        Me.ValidateForControl(Me.lastNameTextBox) And
        Me.ValidateForControl(Me.streetAddressTextBox) And
        Me.ValidateForControl(Me.cityTextBox) And
        Me.ValidateForControl(Me.stateComboBox) And
        Me.ValidateForControl(Me.zipCodeMaskedTextBox) And
        Me.ValidateForControl(Me.phoneMaskedTextBox) And
        Me.ValidateForControl(Me.emailAddressTextBox) And
        Me.ValidateForControl(Me.checkInDateTimePicker) And
        Me.ValidateForControl(Me.checkOutDateTimePicker) And
        Me.ValidateForControl(Me.rentalUnitsGroupBox)
    

    此外,对于布尔人来说, ^ C相当于 Xor 在Visual Basic中?

    6 回复  |  直到 14 年前
        1
  •  7
  •   BobbyShaftoe    14 年前

    And ---GT; &

    Or ---GT; |

    对, Xor ---GT; ^

        2
  •  7
  •   Ðаn    14 年前

    这个 MSDN documentation for && 有一个显示“常规”和“常规”的示例 & 和“短路和” && .

    请务必评论您对 & 正如大多数程序员所期望的那样 && 具有 bool S.


    你也可以写一个 And 扩展方法

    static class BooleanExtensions
    {
        public static bool And(this bool lhs, bool rhs)
        {
            return lhs & rhs;
        }
    }
    

    尽管你最好还是和本地人呆在一起 & 语法。注意,一个 AndAlso 扩展方法不能用作 rhs 参数将作为方法调用的一部分进行计算。

        3
  •  1
  •   Matthew Flaschen    14 年前

    你只要用 & 对于 And | 对于 Or . 两个 ^ != 相当于 Xor 当两个操作数都是布尔值时。

        4
  •  1
  •   Michael Buen    14 年前

    历史上(B语言,C的前身),位运算符(&)被用作逻辑运算符,但由于它不进行短路,因此它们会快速纠正语言并引入短路运算符(&&)

    实际上,由于它的存在,到目前为止,位运算符优先级仍然具有相同的运算符关联性。到目前为止,位运算符(就像逻辑运算符一样)绑定到比较而不是表达式中。

    举例来说,这个运算符的关联性…

    if (A + B == C)
    

    …后面不是:

    if (A & B == C)
    

    在第二个代码上, A 独立评估,以及 B == C 一起评估。这就是为什么我们需要为位运算符加上括号,以实现与数学运算相同的运算符关联性。

    if ( ( A & B ) == C )
    

    C语言启发的语言是不允许的,Java和C语言的设计者可以打破传统,并赋予位操作符和算术运算符相同的算子关联性。但是他们没有,所以外面的大型C代码库可以在这些语言上重用。

    以前,我不明白为什么 & | 行为与 + - / * .

    要回答您的问题,只需使用位运算符:

        protected void Page_Load(object sender, EventArgs e)
        {
    
            bool isValid = A() & B();
    
            Response.Output.Write("<br>Is Valid {0}", isValid);
    
        }
    
        bool A()
        {
            Response.Write("<br>TestA");
            return false;
        }
    
        bool B()
        {
            Response.Write("<br>TestB");
            return true;
        }
    
        5
  •  0
  •   Xint0    14 年前

    使用 & | .

        6
  •  0
  •   Cameron    14 年前

    在这种情况下,您可以使用 bitwise-and operator ( & ):

    return
        this.ValidateForControl(this.firstNameTextBox) &
        this.ValidateForControl(this.middleNameTextBox) &
        this.ValidateForControl(this.lastNameTextBox) &
        this.ValidateForControl(this.streetAddressTextBox) &
        this.ValidateForControl(this.cityTextBox) &
        this.ValidateForControl(this.stateComboBox) &
        this.ValidateForControl(this.zipCodeMaskedTextBox) &
        this.ValidateForControl(this.phoneMaskedTextBox) &
        this.ValidateForControl(this.emailAddressTextBox) &
        this.ValidateForControl(this.checkInDateTimePicker) &
        this.ValidateForControl(this.checkOutDateTimePicker) &
        this.ValidateForControl(this.rentalUnitsGroupBox);
    

    是的,XOR拼写出来了 ^ 在C语言中(如大多数C语言)。