Java: Varför funkar inte denna kod?

Permalänk

Java: Varför funkar inte denna kod?

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int answer;

System.out.print("Skriv in 2 tal: ");
int number1 = input.nextInt();
int number2 = input.nextInt();

System.out.print("Vill du:\n1. Addera\n2. Subtrahera");
int choice = input.nextInt();

choice == 1 ? answer = number1 + number2 : answer = number1 - number2;
}

Den här biten (choice == 1 ? answer = number1 + number2 : answer = number1 - number2;) får errorn Unexpected type. Required: variable. Found: value

Visa signatur

We all got a chicken-duck-woman-thing waiting for us

CPU: Intel Core i7 10700K
GPU: Nvidia GTX 1080
RAM: DDR4 16 GB

Permalänk
Hedersmedlem

Har inte så bra koll på Java men det är väl inte som i C där ett uttryck likt a = 1 + 2 kommer returnera ett värde 3? Uttrycken du skriver för false- och true-grenarna måste resultera i ett värde.

Kolla på exemplen här.
https://alvinalexander.com/java/edu/pj/pj010018

Jag misstänker att du vill skriva

answer = (choice == 1 ? number1 + number2 : number1 - number2);

Permalänk

@Shimonu: Så var det. Tack

Visa signatur

We all got a chicken-duck-woman-thing waiting for us

CPU: Intel Core i7 10700K
GPU: Nvidia GTX 1080
RAM: DDR4 16 GB

Permalänk
99:e percentilen
Skrivet av Shimonu:

Har inte så bra koll på Java men det är väl inte som i C där ett uttryck likt a = 1 + 2 kommer returnera ett värde 3? Uttrycken du skriver för false- och true-grenarna måste resultera i ett värde.

Jodå, tilldelningar är uttryck i Java. Man får skriva så:

String s; System.out.print(s = "Hello world!");

(Dock är jag inte förtjust i att blanda värden och sidoeffekter helt vilt på det sättet.)

Citat:

Kolla på exemplen här.
https://alvinalexander.com/java/edu/pj/pj010018

Jag misstänker att du vill skriva

answer = (choice == 1 ? number1 + number2 : number1 - number2);

Din lösning på TS problem är korrekt, men problemet var att @MariusFranzen försökte använda ett uttryck som ett statement på ett ogiltigt sätt.

På tal om TS, använd [code] när du postar kod i framtiden, @MariusFranzen.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Hedersmedlem
Skrivet av Alling:

Jodå, tilldelningar är uttryck i Java. Man får skriva så:

String s; System.out.print(s = "Hello world!");

(Dock är jag inte förtjust i att blanda värden och sidoeffekter helt vilt på det sättet.)

Din lösning på TS problem är korrekt, men problemet var att @Thunderstruc försökte använda ett uttryck som ett statement på ett ogiltigt sätt.

På tal om TS, använd [code] när du postar kod i framtiden, @Thunderstruc.

Menar du att ternary-uttrycket i sig blir fel och inte självaste grenarna?
Får man skriva såhär i Java?:

answer = (choice == 1 ? answer = a + b : answer = a - b);

EDIT:
Intressant, så får man inte skriva i C vilket jag trodde.

Permalänk
Skrivet av Shimonu:

Menar du att ternary-uttrycket i sig blir fel och inte självaste grenarna?
Får man skriva såhär i Java?:

answer = (choice == 1 ? answer = a + b : answer = a - b);

EDIT:
Intressant, så får man inte skriva i C vilket jag trodde.

Om du vill skriva så i java får du dock köra såhär
answer = (choice == 1 ? a + b : a - b);
Tänk att du ska ju ge answer ngt värde och (choice == 1 ? a + b : a - b) är ju egentligen som att skriva
if (choice == 1) {
return a+b;
} else {
return a-b;
}

Alltså skriver du answer = (choice == 1 ? answer = a + b : answer = a - b); går det inte för du först skriver att
answer "ska vara lika med det jag får av detta uttrycket som kmr härnäst" men där blandar du in answer igen

Permalänk
Hedersmedlem
Skrivet av brullelied:

Om du vill skriva så i java får du dock köra såhär
answer = (choice == 1 ? a + b : a - b);
Tänk att du ska ju ge answer ngt värde och (choice == 1 ? a + b : a - b) är ju egentligen som att skriva
if (choice == 1) {
return a+b;
} else {
return a-b;
}

Alltså skriver du answer = (choice == 1 ? answer = a + b : answer = a - b); går det inte för du först skriver att
answer "ska vara lika med det jag får av detta uttrycket som kmr härnäst" men där blandar du in answer igen

Jo, jag förstår hur ternary fungerar och så vidare, jag är lite intresserad av specialfall och vad som faktisikt händer.

Man kan ju till exempel skriva den här if-satsen i C:

int c; if (choice == 1) { return c = a + b; } else { return c = a - b; }

Motsvarigheten för ternary trodde jag också skulle fungera men det gör det inte och jag vet inte om jag förstår varför.

Permalänk
Medlem

du kan skriva raden du vill skriva på två sätt

if(choice==1) answer =(number1 + number2) else answer =(number1 - number2)

alt så kan du använda ?: notationen och då är korrekt notation

answer=( (choice==1) ? (number1+number2) : (number1-number2) )

överkurs:

vad händer om du skriver in något felaktigt?
följande fel kan uppstå i koden

InputMismatchException,NoSuchElementException, IllegalStateException

inputMismatch är ganska lätt att undvika genom att kolla att nästa inputvärde faktiskt är ett heltal genom funktionen boolean hasInt() innan du försöker göra en nextInt()

övriga två problem bör man wrappa i en Try/Catch sats

try{ ... kod som använder Scanner } catch(NoSuchElementException e){ System.out.println("Inget heltal inskrivna, försök igen"); } catch(IllegalStateException e){ System.out.println("programfel Scanner är stängd"); }

sen har du kvar att hantera det sista problemet ... vad händer om man skriver något annat än en 1 i sista frågan? du utgår i från att det är subtraktion är dett ett korrekt antagande? korrekt borde vara:

kolla om det är 1 , genomför addition
annars kolla om det är 2 , genomför subtraktion
annars be användaren försöka igen.

Permalänk
Medlem
Skrivet av Shimonu:

int c; if (choice == 1) { return c = a + b; } else { return c = a - b; }

det som händer är ganska lätt här
det handlar om operator presidents

return c = a + b; --> funcRet() = (c = a + b ) ; --> funcRet() = c = (a+b); -- > a+b räknas ut --> sparas ner i c --> returneras ur funktionen.

att spara ner c kan vara viktigt om det tex är en statisk metod.

(nu var det sjukt länge sedan jag läste Java) men om jag inte minns fel så se varje anrop som en adress.

då borde

Answer = (Answer = A+B) faktiskt funka så länge du enkapslar det i en parantes.

http://mindprod.com/jgloss/precedence.html

Permalänk
Hedersmedlem
Skrivet av cg_thi:

det som händer är ganska lätt här
det handlar om operator presidents

return c = a + b; --> funcRet() = (c = a + b ) ; --> funcRet() = c = (a+b); -- > a+b räknas ut --> sparas ner i c --> returneras ur funktionen.

att spara ner c kan vara viktigt om det tex är en statisk metod.

(nu var det sjukt länge sedan jag läste Java) men om jag inte minns fel så se varje anrop som en adress.

då borde

Answer = (Answer = A+B) faktiskt funka så länge du enkapslar det i en parantes.

http://mindprod.com/jgloss/precedence.html

Ah, nu står världen rätt till. när jag försökte med

c = (condition ? c = a + b : c = a - b);

Så fick jag ett fel om lvalue required as left operand vilket kändes konstigt men det behövdes helt enkelt parentes runt uttrycken.

Permalänk
99:e percentilen

@Shimonu, vidare efterforskningar ger (föga förvånande) vid handen att typcheckningen i Java inte har några problem med till exempel strängar som statements, men att strängliteraler stoppas i parsningen. Följande är nämligen ogiltigt:

"hej";

Men det går bra att skriva så här:

public static String f() { return "hej"; } f();

Specifikationen är tydlig med vilka uttryck som är tillåtna som statements:

ExpressionStatement: StatementExpression ; StatementExpression: Assignment PreIncrementExpression PreDecrementExpression PostIncrementExpression PostDecrementExpression MethodInvocation ClassInstanceCreationExpression

Blir aldrig riktigt klok på språk med sidoeffekter.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Hedersmedlem
Skrivet av Alling:

@Shimonu, vidare efterforskningar ger (föga förvånande) vid handen att typcheckningen i Java inte har några problem med till exempel strängar som statements, men att strängliteraler stoppas i parsningen. Följande är nämligen ogiltigt:

"hej";

Men det går bra att skriva så här:

public static String f() { return "hej"; } f();

Specifikationen är tydlig med vilka uttryck som är tillåtna som statements:

ExpressionStatement: StatementExpression ; StatementExpression: Assignment PreIncrementExpression PreDecrementExpression PostIncrementExpression PostDecrementExpression MethodInvocation ClassInstanceCreationExpression

Blir aldrig riktigt klok på språk med sidoeffekter.

Haha intressant! Tack.