将 int 初始化与 if 语句参数的布尔运算符进行比较

Comparing an int initialization with a boolean operator for an if statement parameter

提问人:Carson Turner 提问时间:1/20/2023 最后编辑:hfontanezCarson Turner 更新时间:1/20/2023 访问量:70

问:

我已经声明了 ints skyBday,并写了这一行:

if (skyB == true || (day=1) != true) {
System.out.print("example text");  
}

我假设代码将正确执行给定这些参数的参数是否正确?我特别不确定 (day=“1”) 是否会被正确检测为 false,因为对象输入确实是 false。

最小可重现示例(不包括主要方法或软件包):

 int skyB = false;

 int day =2;

 if (skyB == true || (day =1) != true) {
System.out.print("example text");  }
java 逻辑布尔 表达式

评论

0赞 Robby Cornelissen 1/20/2023
您不是比较两个整数,而是将一个整数与布尔值进行比较,并将一个字符串分配给一个整数。甚至不会编译。
0赞 Jens 1/20/2023
请分享一个最小的可重复示例
0赞 Jens 1/20/2023
如果您不确定,请尝试编写单元测试。
0赞 Carson Turner 1/20/2023
我无法自己测试代码,因为我使用的是无法处理 JDK 的较慢 PC,但这是我的 CS 作业
0赞 Jens 1/20/2023
使用 false 或字符串初始化 int 没有意义。

答:

0赞 hfontanez 1/20/2023 #1

答案很简单:这不是C++

不能将数值分配给布尔字段。在 Java 中,只有两个有效值是 和 。因此,不能将整数值分配给布尔变量。truefalse

要使布尔表达式有效,变量 和 必须是数据类型skyBdayboolean

boolean skyB = false
boolean day = true

if (!skyB || day) {
  System.out.print("example text");
}

无需将它们与 true 或 false 进行比较即可计算这些字段。表达式(读作“not skyB”)的计算结果为 。所以这相当于.由于该部分的计算结果为 true(skyB 等于 false),因此跳过表达式的第二部分并调用 。如果将值 of 更改为 true,则将计算该变量,并且如果该变量的值等于 true(确实如此),则将执行 if 语句。boolean!skyBfalseskyB == falseSystem.out.print()skyBday

或者,您可以使用数值生成布尔表达式。如何?简单。任何数学表达式的计算结果都相同。例如:

int x = 5;
int y = 3;

if (x > y) {
  System.out.println("x is greater than y");
}

基本上。。。您尝试执行的逻辑(我的理解方式)是正确的,但您的实现并非如此。不能混合使用布尔字段和数值。这在 Java 中是不允许的。

现在,对于你的问题......

boolean skyB = false; // this must be boolean, not int
int day =2;       // this is fine

if (skyB || day == 1) {
  System.out.print("example text");
}

应该产生预期的结果。用通俗易懂的英语,上面的内容如下:

如果 skyB 是假的,或者是第一天,请打印“示例测试”

如果表达式的任一部分的计算结果为 true(即,如果 skyB 为 true,并且 day 变量是 1 以外的任何值),则不会打印任何内容。

更新

即使这个答案已被接受并被点赞,我也想包含一些关于布尔表达式的信息,以利于可能正在为这个概念而苦苦挣扎的新开发人员。

什么是布尔表达式?

根据 Oracle 文档,“布尔表达式是 TRUE 或 FALSE 的逻辑语句。这些表达式有几种不同的形式。例如

  • 布尔文本
if (true) {...}

虽然这种if语句没有真正的理由,但以上是一个有效的表达式。“如果属实,那就做卷曲牙套里的东西。”这意味着里面的东西将始终执行(使其与没有“if”相同。但是,这是理解其余部分的基础。

  • 布尔变量
boolean isBlue = false;
if (isBlue) {...}

在上面的例子中,布尔表达式是变量本身。预期是,如果变量值的计算结果为 ,大括号内的内容将被执行。由于该值为 false,因此不会执行该值。上面的“如果”是更被接受的缩写形式true

boolean isBlue = false;
if (isBlue == true) {...}

因此,由于此计算的左侧(变量)值为 false,而右侧为 true,因此整个表达式的计算结果为 false。因此,大括号内的内容不会被执行(false 不等于 true)。然而

boolean isBlue = false;
if(!isBlue == true){...}

否定布尔变量会切换其值。在本例中,变量的值为 。“not” 运算符将其值切换为 。由于计算结果为 true(true 等于 true 是 true 表达式),因此将执行大括号内的内容。isBluefalsetruetrue == true

  • 生成布尔值的函数
public boolean isSkyBlue() {
  return true; // sorry for the over simplification
}
...
if (isSkyBlue()) {...}

这只不过是我已经展示过的一种高级形式。在本例中,该方法“计算”要返回的布尔值。由于布尔值本身就是表达式,因此在括号内插入方法调用(如上图所示)是有效的。大括号内的内容将执行,只要函数返回 .true

  • 比较操作

我已经包含了以下示例:

int x = 5;
int y = 3;

if (x > y) {
  System.out.println("x is greater than y");
}

任何类型的比较操作都会产生 true 或 false。因此,这些比较运算是布尔表达式。这还包括重写方法的结果。例如:Object#equals(Object)

String s = "Hello";
if (s.equals("Hello")) {...}

顺便说一句,Java 中的对象应该使用重写的方法进行比较,而不是使用 double-equals 运算符(除非您只对比较对象引用(地址)是否相等感兴趣。equals()

评论

0赞 Carson Turner 1/20/2023
非常感谢,这解决了我的问题。快速跟进,我基本上是想问这是否是第 1 天,在第 1-7 天的列表中,而不限制自己使用布尔值。唯一可行的方法是在一周中的每一天嵌套我的 if 语句吗?我的任务是使用布尔运算符。
0赞 Carson Turner 1/20/2023
基本上,如何从列表中返回一个值以作为 if 语句参数进行检查?
0赞 hfontanez 1/20/2023
@CarsonTurner 我回答了你的主要问题。如果您对我提供的答案感到满意,请单击复选以选择正确答案。至于你最后的评论,这完全是一个单独的问题。您必须为此发布另一个问题。我也很乐意为您提供帮助。