如果陈述和&&出现IDE错误'令牌上的语法错误“=”,< = expected'

时间:2015-08-29 07:24:25

标签: java operators

我有一个简单的猜数游戏。它具有询问您是否需要提示的功能。它会将响应保存在boolean tips中,如图所示。

while (run) {
    while (tinvalidrun){
        System.out.println("Do you want any tips? y or n?");
        input=in.next();
        switch(input){
        case "y":
            System.out.println("Ok, we will tell you how close you are!");
            tinvalidrun=false;
            tips=true;
            break;
        case "n":
            System.out.println("Wanna go hard eh? Well, go along!");
            tinvalidrun=false;
            break;
        default:
            System.out.println("You pressed the wrong key!\nDo you have butter fingers?");
        }
    }

然后我有一些代码可以生成更多变量并生成一个随机数。最后我获得猜测的用户输入并测试它:

do {
    System.out.println("Enter a number: ");
    guess = in.nextByte();
    times++;
    if (guess == gval) {
        break;
    } else {
        System.out.println("No luck! Try again!");
        if (tips=true) {
            if (guess < gval) {
                  System.out.println("You are too low!");
            }
            else { 
                System.out.println("You are too high!");
            }
        }
    } 

我尝试将tips=trueguess < gvalif放在一个&&中但不起作用。我这样做了:

if(guess<gval && tips=true)

它要求我将=替换为<=或类似的东西。我尝试使用两个if语句但是当你拒绝时,它仍会显示提示。我试着看着括号,但看起来很好。请帮忙!如果我可以对我的代码做任何简化或改进或想法,欢迎他们。

我还有更多问题。当您尝试键入整数字母时,它(显然)会崩溃。我尝试使用字符串和我的tinvalidrun循环来避免这种情况,但我不能。有没有办法做到这一点?  谢谢! :)

8 个答案:

答案 0 :(得分:10)

测试平等

在测试tips == true时,您需要if (guess<gval && tips)if (tips)boolean

=assignment operator==equality operator。将这两者混合起来很容易,但差别很大......

布尔赋值也是(意外)相等性测试

你说&#34; 我尝试使用两个if语句但是当你拒绝时,它仍会显示提示。&#34;。 if语句需要一个must have type boolean的表达式。任何赋值表达式(即tips = true)都将作为分配给变量的新值进行求值。来自JLS §15.26.1 Simple Assignment Operator

  

在运行时,赋值表达式的结果是赋值发生后变量的值。赋值表达式的结果本身不是变量。

因此if (tips = true)是有效的语法,因为tips = true 一个赋值和一个boolean表达式,因此可以在{{1}中使用}。

在您的情况下iftips = true分配给true(即使它开始为tips),然后返回false的新值。 tips会看到新值(if)并继续愉快地继续。因此,true原来不是tips的测试。例如,这意味着以下内容打印出true文本:

"Oops!"

正如您所看到的,将分配和测试混为一谈通常是个坏主意。如果您在boolean tips = false; if (tips=true){ System.out.println("Oops! This tests as true, but that isn't what we wanted"); } / = / if表达式中使用do,通常会出错。有时它可以帮助简洁,但通常是不好的做法。

为什么while无效?

这是由于operator precedence。在表达式if (guess<gval && tips = true)中,运算符优先级为if (guess<gval && tips = true),然后是<,然后是&&,因此编译器不再将=部分评估为{tips = true的赋值1}}提示。您可以使用括号来包含true,但正如我上面所说,您并不真正想要分配,因此您可以忽略此详细信息

测试有效字节输入

对于问题的最后一部分 - 如果有人输入一封信,你会说你得到一个无效的字节。我猜你得到tips = true

您可以使用Scanner.hasNextByte()来测试输入是否是一个字节,然后再使用它。如果返回false,则可以使用java.util.InputMismatchException使用和丢弃输入,打印出错误消息并再次循环。

根据您编写代码的方式,您可能还会看到来自eclipse的消息,例如&#34;运算符&lt; =未定义参数类型(s) )boolean,Boolean&#34;或者来自javac,例如&#34;错误:意外类型...必需:变量,找到:值&#34;。除了你的语法充分混乱之外,它们都没有告诉你多少,编译器无法解析它。

答案 1 :(得分:5)

if(tips = true)始终为true条件,因为此处我们true值为tipsif

首先会将提示分配为true,然后检查将在else中执行,因此此else部分已死和控制永远不会进入tips部分。

如果您想检查true是否为if(tips),那么您只需编写false,如果您想检查它是否if(tips == false,那么您应该写==)。 =将检查assigned,而<!DOCTYPE html> <html> <head> <title>My Game</title> <link href="assets/MyGame.css" rel="stylesheet" type="text/css"/> <script src="https://code.createjs.com/preloadjs-0.6.1.min.js"></script> <script src="https://code.createjs.com/tweenjs-0.6.1.min.js"></script> <script language="javascript" type="text/javascript" src="https://code.createjs.com/easeljs-0.8.1.min.js"></script> <script language="javascript" type="text/javascript" src="MyGame.js" ></script> </head> <body> <canvas id="demoCanvas" width="1000" height="700"></canvas> </body> </html> var stage; window.onload = function() { var queue = new createjs.LoadQueue(true); queue.on("fileload", handleFileLoad, this); queue.loadFile({id:"image", src:"assets/space.jpg"}); queue.load(); stage = new createjs.Stage("demoCanvas"); } function handleFileLoad(event) { // A reference to the item that was passed in to the LoadQueue var item = event.item; var type = item.type; // Add any images to the page body. if (type == createjs.LoadQueue.IMAGE) { stage.addChild(event.result) stage.update; } } 将分配值或参考。

答案 2 :(得分:4)

首先,等于运算符的测试是==而不是=。其次,在测试布尔值时,您不需要运算符。 if (tips) ...就足够了。

答案 3 :(得分:4)

===是完全不同的两件事。 =是赋值运算符,用于为变量赋值。 ==是等号运算符,用于检查变量是否等于某个值,或等于另一个变量。

您应该使用==代替。

答案 4 :(得分:2)

在这一行

post_id

if(tips=true) 表示分配

这应该是

=

答案 5 :(得分:2)

一个等号用于分配(guess = in.nextByte();, tinvalidrun=false, tips=true;,等等),RHS变量中的值为&#34; put&#34;到LHS变量。变得相等,即它们包含相同的值。要进行比较,请使用两个等号运算符,即比较运算符(foo1 == foo2)。 several operators

答案 6 :(得分:1)

有一点变化,使用==而不是=

而不是

if (tips==true)

你会做的

{{1}}

答案 7 :(得分:1)

  1. 比较是双==,单是分配。
  2. 与真实的比较是冗余(但合法)
  3. if(guess < gval && tips==true)
    

    if(guess<gval && tips)
    

    您的代码片段不显示变量声明,也许您也会比较错误的类型。我的片段假定提示为boolean