Bedingungsoperatoren ? :

Status
Nicht offen für weitere Antworten.

siba

Bekanntes Mitglied
Hallo!

Welchen Fehler begehe ich bei der Umsetzung von "? :" ?



Code:
public class IfErsatz {

	
	public static void main(String[] args) {
		int x = 5;
		(x == 5) ? System.out.println("Ja"); : System.out.println("Nein");

	}

}
 

byte

Top Contributor
Code:
int x = 5;
System.out.println((x==5) ? "Ja" : "Nein");
 

me.toString

Bekanntes Mitglied
Die Antwort von "byto" ist zwar richtig ... aber dennoch ein wenig dürftig ausgefallen?
Das dein ? : -Konstrukt nicht funktioniert hat (Fehlermeldung b eim Kompilieren ist auch recht eigenartig), ist ganz einfach.
Die beiden Möglichkeiten (also rechts und links vom Doppelpunkt) müssen einen Wert zurückliefern, der dann gleich weiterverwendet wird. System.out.println() gibt dir aber nix zurück.
Du musst also den Rückgabewert des Konstruktes auffangen und weiterverarbeiten:
Code:
String entscheidung = ( x == 5 ? "Ja" : "Nein" ); 
System.out.println( entscheidung );
Sieht, so finde ich zumindest, auch gleich viel aufgeräumter aus. ... natürlich könnte man auch beides in eine Zeile quetschen ... aber wir wollen ja keinen Wettbewerb im Kurzcodeschreiben gewinnen.

Michael
 

byte

Top Contributor
ehli75 hat gesagt.:
... natürlich könnte man auch beides in eine Zeile quetschen ... aber wir wollen ja keinen Wettbewerb im Kurzcodeschreiben gewinnen.

Naja, das ist ja grad der Vorteil an dieser Notation, dass sie eben kurz ist. Wenns um Übersichtlichkeit geht, sollte man eh die normale If-Then-Else Notation verwenden.
 

thE_29

Top Contributor
Jop ;)

Aber diese ternären Dinger sind super :)

bestes Bsp.:

Code:
    for(int x = 0, y = 1; x != getRunningServicesCount(); y++)
      strRet[x] = isServiceRunning(y) ? ((++x == x) ? getServiceName(y) : "") : "";
 

thE_29

Top Contributor
x erhöhen ^^

Verstehst du das ganze ;)


wenn isServiceRunning true zurückgibt, wird x erhöt und es soll aber ein string zurückgegeben werden...

das könnste könnte man so aufteiln

Code:
if(isServiceRunning(y)
{
 strRet[x] = getServiceName(y);
 x++;
}

es wird ja so durchgegangen

x = 0

strRet[0] = isServiceRunning(0) ? ((1 == 1) ? getServiceName(0) : "") : "";

vorne hatte x noch den niedirigern wert und hinten wirds erhöht ^^



@Al: Das habe ich eigentlich eingebaut um meine Mitarbeiter zu ärgern/verwirren ;)
 

norman

Top Contributor
thE_29 hat gesagt.:
Jop ;)

Aber diese ternären Dinger sind super :)

bestes Bsp.:

Code:
    for(int x = 0, y = 1; x != getRunningServicesCount(); y++)
      strRet[x] = isServiceRunning(y) ? ((++x == x) ? getServiceName(y) : "") : "";

naja, ich finde du hast das da verkompliziert:
Code:
for(int x = 0, y = 1; x != getRunningServicesCount(); y++) {
	    	 
	    	 // deine Var.
	    	 strRet[x] = isServiceRunning(y) ? ((++x == x) ? getServiceName(y) : "") : "";
	    	 
	    	 // deine Var in langform
	    	 if (isServiceRunning(y)){
	    		 if (++x == x) {
	    			 strRet[x] = getServiceName(y);
	    		 } else {
	    			 strRet[x] = "";
	    		 }
	    	 } else {
	    		 strRet[x] = "";
	    	 }
	    	 
	    	 // verkürze langform
	    	 if ((isServiceRunning(y)) && (++x == x)) {
	    		 strRet[x] = getServiceName(y);
	    	 } else {
	    		 strRet[x] = "";
	    	 }
	    	 
	    	 // kurze kurzform
	    	 strRet[x] = ((isServiceRunning(y)) && (++x == x))? getServiceName(y) : ""; // <== !!!
	     }

so lässt sich das dann auch gleich besser verstehen :)
 

Murray

Top Contributor
Der innere ternäre Operator
Code:
((++x == x) ? getServiceName(y) : "")
ist aber doch Quatsch; wie Du ja selbst erklärst, ist ++x == x ja immer true.
Insofern sollte sich das Ziel doch auch so erreichen lassen:
Code:
for(int x = 0, y = 1; x != getRunningServicesCount(); y++)
      if ( isServiceRunning(y)) strRet[x++] = getServiceName(y);
//EDIT: Typo
 

norman

Top Contributor
wie gesagt,
Code:
strRet[x] = ((isServiceRunning(y)) && (++x == x))? getServiceName(y) : "";
 

Murray

Top Contributor
Wenn schon kompliziert:
Code:
strRet[x++] = isServiceRunning( y) ? getServiceName(y) : strRet[--x];
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben