【问题标题】:Java assignment operatorJava 赋值运算符
【发布时间】:2015-05-02 09:00:55
【问题描述】:

以下引用摘自http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-137265.html

不要在容易与等式运算符混淆的地方使用赋值运算符。示例:

if (c++ = d++) {        // AVOID! (Java disallows)
    ...
}

应该写成

if ((c++ = d++) != 0) {
    ...
}

我被这条线弄糊涂了

if ((c++ = d++) != 0) {

对此的任何澄清将不胜感激。

【问题讨论】:

    标签: java variable-assignment equality convention


    【解决方案1】:

    (c++ = d++) 是整数表达式,而不是布尔表达式。它评估在c++ = d++ 分配中分配给任何整数c。因此if (c++ = d++) { 在 java 中是非首发。

    因此与 0 的比较是将整数表达式转换为布尔值所需要的。

    而且我认为这是不言而喻的。代码编写如下:

    if ((c++ = d++) != 0) {
    

    只是糟糕的编码。首先,比较内的内部赋值。然后是它里面的后缀运算符。两者都导致难以阅读的代码块,容易出现错误,难以维护等......更好的写法如下:

    c = d;
    c++;
    d++;
    if (c == d) {
    

    但你已经知道了。 :)

    【讨论】:

      【解决方案2】:

      他们只是想说编译器需要if 语句的条件才能评估为boolean 值。如果您知道自己在做什么,并决定将具有副作用的实际代码作为条件,则需要使表达式计算为boolean 类型的值。

      虽然示例中的反模式代码可以在像 C 这样的编程语言中运行,其中 boolean 值实际上是整数(其中零是 false,非零是 true),但正确的方法是在 Java 中执行此操作实际上是将结果与 0 进行比较。

      【讨论】:

        【解决方案3】:

        在页面的最开始我可以看到 -

        此页面没有得到积极维护。文档中的链接可能无效,并且信息本身可能不再有效。本文档的最后一次修订是在 1999 年 4 月 20 日

            if ((c++ = d++) != 0) {
                //logic
            }
        

        语法甚至无效(使用 Java6)。它给了我

        The left-hand side of an assignment must be a variable
        

        您需要将 c++ 分配给某个变量。

        【讨论】:

        • 它在 java 8 中也无效。同样的错误。但是把++ 去掉c 就可以了。
        【解决方案4】:

        与 C 等其他语言相比,Java 的标量原语(整数等)不能用作布尔值。换句话说,0 绝不是truefalse。只有事物等于 0 可以是truefalse

        【讨论】:

          猜你喜欢
          • 2011-11-16
          • 2015-03-19
          • 2013-02-14
          • 2014-04-17
          • 2018-11-30
          • 1970-01-01
          • 2014-11-08
          • 2011-08-02
          • 2019-10-06
          相关资源
          最近更新 更多