为啥编译器没有注意到布尔值已被声明为真?

Posted

技术标签:

【中文标题】为啥编译器没有注意到布尔值已被声明为真?【英文标题】:Why isn't the compiler noticing that a boolean has been declared true?为什么编译器没有注意到布尔值已被声明为真? 【发布时间】:2016-11-10 19:37:47 【问题描述】:

在这个方法中:

 private void implementVisibility(EditText A, EditText B, ImageButton C, boolean visible) 
   if (visible) 
     A.setVisibility(View.VISIBLE);
     B.setVisibility(View.VISIBLE);
     C.setVisibility(View.VISIBLE);
   
   else if (!visible)     // warning here
   
 

else if (!visible) 行我收到警告:

条件 !visible 始终为真 可见的值总是假的

但是看调用方法:

if (count2.getVisibility() == View.INVISIBLE) 
  implementVisibility(count2, action2, remove2,true);

visible true,因此它并不总是为假。为什么编译器没有注意到这一点?

【问题讨论】:

改用else 只需阅读您的代码。首先,您要问“这是真的”;如果不是这种情况,您会问“这不是真的吗”。提示:你不需要第二个问题;这就是布尔值的概念——它不是真就是假。并提示:A、B、C 是变量的真正糟糕名称。我认为禁止每个变量名使用多个字符的法律在 1979 年底被废除了 ;-) 布尔只有两种可能,所以if和else语句就足够了 你的意思是,在行:implementVisibility(count2, action2, remove2,true);编译器必须注意到最后一个参数总是正确的? @berserk 它说布尔值始终为假,但在一种方法中,我将该布尔值传递为真 【参考方案1】:

当程序控制到达else if(!visible)时,visible只能成为false

您的编译器暗示您应该将代码澄清为 else

【讨论】:

【参考方案2】:

布尔变量只有两个值真或假,所以你应该编辑你的代码如下:

private void implementVisibility(EditText A, EditText B, ImageButton C, boolean visible) 
        if (visible) 
            A.setVisibility(View.VISIBLE);
            B.setVisibility(View.VISIBLE);
            C.setVisibility(View.VISIBLE);
        
        else 
            // do something
        

    

【讨论】:

以上是关于为啥编译器没有注意到布尔值已被声明为真?的主要内容,如果未能解决你的问题,请参考以下文章

为啥声明“2i;”不会导致编译器错误?

为啥 C# 8.0 中使用声明的变量的闭包不同?

选项值已更改 - ODBC 错误 2169

为啥不包含头文件却可以调用函数,谁来解释

为啥 -O3 GCC Optimization 没有内联这个函数?

收到警告 订单描述元素的值已被截断。在贝宝