Question

Je travaille avec Java quelques années, mais jusqu'à récemment, je n'ai pas couru dans cette construction:

int count = isHere ? getHereCount(index) : getAwayCount(index);

Ceci est probablement une question très simple, mais quelqu'un peut-il expliquer? Comment puis-je lire? Je suis assez sûr que je sais comment cela fonctionne.

  • si isHere est vrai, getHereCount() est appelé,
  • si isHere est faux getAwayCount() est appelé.

Correct? Qu'est-ce que cette construction a appelé?

Était-ce utile?

La solution

Oui, il est une forme abrégée de

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

Il est appelé l'opérateur conditionnel . Beaucoup de gens (à tort) appellent l'opérateur ternaire , car il est le seul opérateur ternaire (à trois arguments) en Java, C, C ++, et probablement beaucoup d'autres langues. Mais il y a théoriquement pourrait être un autre opérateur ternaire, alors qu'il ne peut y avoir un opérateur conditionnel .

Le nom officiel est donné dans la section Java Language Specification :

  

§15.25 de l'opérateur conditionnel? :

     

Le ? : opérateur conditionnel utilise la valeur booléenne d'une expression à décider laquelle des deux autres expressions doivent être évaluées.

Notez que les deux branches doivent conduire à des méthodes avec des valeurs de retour:

  

Il y a une erreur de temps de compilation pour la deuxième ou la troisième expression d'opérande comme une invocation d'une méthode de vide.

     

En fait, par la grammaire des états d'expression ( §14.8 ), il est interdit pour une expression conditionnelle à apparaître dans un contexte où l'invocation d'une méthode de vide pourrait apparaître.

Donc, si doSomething() et doSomethingElse() sont des méthodes vides, vous ne pouvez pas Compress:

if (someBool)
    doSomething();
else
    doSomethingElse();

dans ceci:

someBool ? doSomething() : doSomethingElse();

Des mots simples:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

Autres conseils

D'autres ont répondu à cette à mesure raisonnable, mais souvent avec le nom « opérateur ternaire ».

Étant pédant que je suis, je voudrais préciser que le nom de l'opérateur est l'opérateur conditionnel ou « opérateur conditionnel? ». Il est a opérateur ternaire (en ce qu'elle a trois opérandes) et il se trouve être le seul opérateur ternaire en Java pour le moment.

Cependant, la spécification est assez clair que son nom est l'opérateur conditionnel ou « opérateur conditionnel: » être absolument sans ambiguïté. Je pense qu'il est plus clair pour l'appeler par ce nom, car il indique le comportement de l'opérateur dans une certaine mesure (l'évaluation d'une condition) plutôt que le nombre opérandes qu'il a.

Selon le Sun Java Specification , il est appelé l'opérateur conditionnel. Voir la section 15.25. Vous avez raison à ce qu'il fait.

L'opérateur conditionnel? :. Utilise la valeur booléenne d'une expression à décider laquelle des deux autres expressions doivent être évaluées

L'opérateur conditionnel est syntaxiquement droit associatif (groupes informatiques de droite à gauche), de sorte qu'un b: c d: e f: g signifie la même chose qu'un b:? (C d :( ? e f. g))

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

L'opérateur conditionnel a trois expressions d'opérandes; ? apparaît entre les première et deuxième expressions, et:. apparaît entre les deuxième et troisième expressions

La première expression doit être de type booléen ou booléenne, ou une erreur se produit lors de la compilation.

Pas tout à fait correct, pour être précis:

  1. si isHere est vrai, Résultat de getHereCount () est retour
  2. otheriwse Résultat de getAwayCount () est retour

Ce "retour" est très important. Cela signifie que les méthodes doivent retourner une valeur et que la valeur doit quelque part assignée.

En outre, il est pas exactement syntaxiquement équivalent à la version if-else. Par exemple:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

Si codé avec if-else entraînera toujours plus bytecode.

int count = isHere ? getHereCount(index) : getAwayCount(index);

signifie:

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
condition ? truth : false;

Si la condition est true puis retourner le premier paramètre. Si la condition est false, retourner le second paramètre.

Il est appelé opérateur conditionnel et il est un type de ternaires de fonctionnement.

ternaires conditionnelle; tomate, tomatoh. Ce qu'il est vraiment précieux pour l'initialisation est variable. Si (comme moi) vous êtes friands de initialisation des variables où ils sont définis, l'opérateur ternaire conditionnel (car il est à la fois) vous permet de le faire dans les cas où il y a une conditionnalité de sa valeur. Particulièrement notable dans les domaines finaux, mais utiles ailleurs aussi.

par exemple:.

public class Foo {
    final double    value;

    public Foo(boolean positive, double value) {
        this.value = positive ? value : -value;
    }
}

Sans cet opérateur - quel que soit le nom - vous devez rendre le champ non-finale ou écrire une fonction simplement pour l'initialiser En fait, ce n'est pas juste -. Il peut encore être initialisé en utilisant si / autre, au moins en Java. Mais je trouve cela plus propre.

Cette construction est appelée ternaires opérateur en sciences informatiques et techniques de programmation.
et href="http://www.webopedia.com/TERM/T/ternary_operator.html" donne l'explication suivante, ce qui est bon calme pour le comprendre:

  

Un opérateur ternaire est une opération d'exploitation sur 3 entrées. Il est un raccourci pour un if-else déclaration, et est également connu comme un opérateur conditionnel.

     

Dans Perl / PHP fonctionne comme: boolean_condition ? true_value : false_value

     

En C / C ++ fonctionne comme: logical expression ? action for true : action for false

Cela peut être lisible pour certaines conditions logiques qui ne sont pas trop complexes sinon il est préférable d'utiliser Sinon si bloc avec la combinaison prévue de logique conditionnelle.

Nous pouvons simplifier la Si-Else blocs avec cet opérateur pour une ligne ternaires de déclaration de code
Par exemple:.

if ( car.isStarted() ) {
     car.goForward();
} else {
     car.startTheEngine();
}

peut être égal à ce qui suit:

( car.isStarted() ) ? car.goForward() : car.startTheEngine();

Donc, si l'on se réfère à votre déclaration:

int count = isHere ? getHereCount(index) : getAwayCount(index);

Il est en fait l'équivalent de 100% des actions suivantes Sinon si bloc :

int count;
if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}

Voilà!
Espérons que cela a été utile à quelqu'un!
Vive!

Correct. Il est appelé opérateur ternaire . Certains appellent aussi opérateur conditionnel .

L'opérateur ternaire (?)

The ternary operator is an operator that takes three arguments. The first 
argument is a comparison argument, the second is the result upon a true 
comparison, and the third is the result upon a false comparison.

Vous pourriez être intéressé par un sélectionnés pour un examen plus approfondi sous la rubrique "Coin du projet." 7 de JDK

En fait, il peut prendre plus de 3 arguments. Par exemple, si nous voulons vérifier un certain nombre est wether positif, négatif ou nul, nous pouvons faire ceci:

String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";

ce qui est mieux que d'utiliser si, d'autre si, d'autre.

Il est l'opérateur conditionnel, et il est plus que juste une façon concise de l'écriture si les déclarations.

Comme il est une expression qui renvoie une valeur peut être utilisée dans le cadre d'autres expressions.

Oui, vous avez raison. ?: Est généralement appelé « opérateur conditionnel ternaire », souvent appelé simplement « opérateur ternaire ». Il est une version abrégée de la norme if / else conditionnelle.

ternaires opérateur conditionnel

J'arrive vraiment comme cet opérateur, mais le lecteur doit être pris en considération.

Vous avez toujours un équilibre entre compacité du code avec le temps passé à lire, et en ce qu'il a quelques défauts assez graves.

Tout d'abord, il y a le cas original de Asker. Il vient de passer une heure et affichage sur la lecture des réponses. Comment aurait-il fallu plus l'auteur d'écrire tous: comme si / alors tout au long de toute sa vie. Pas une heure pour être sûr.

En second lieu, dans les langues C-like, vous obtenez l'habitude de simplement savoir que conditionals sont la première chose dans la ligne. Je l'ai remarqué quand j'utilisais Ruby et suis tombé sur des lignes comme:

callMethodWhatever(Long + Expression + with + syntax) if conditional

Si j'étais longtemps utilisateur Ruby je n'aurais probablement pas eu un problème avec cette ligne, mais venant de C, quand vous voyez « callMethodWhatever » comme la première chose dans la ligne, vous vous attendez à exécuter. Le:. Est moins cryptique, mais encore assez inhabituel pour lancer un lecteur off

L'avantage, cependant, est un sentiment vraiment cool dans votre ventre quand vous pouvez écrire un 3-ligne instruction if dans l'espace de 1 des lignes. Ne peut pas nier que :) Mais honnêtement, pas nécessairement plus lisible par 90% des gens là-bas simplement à cause de sa rareté.

Quand il est vraiment une mission basée sur une valeur booléenne et les valeurs que je n'ai pas de problème avec lui, mais il peut facilement être abusé.

Les expressions conditionnelles sont dans un style complètement différent, sans explicite si la déclaration.

La syntaxe est: Expression booléenne ? expression1: expression2;

Le résultat de cette expression conditionnelle est

expression1 si l'expression booléenne est vrai;

sinon le résultat est expression_2.

Supposons que vous voulez attribuer le plus grand nombre de num1 variable et num2 max. Vous pouvez simplement écrire une déclaration en utilisant l'expression conditionnelle: max = (num1> num2)? num1: num2;

Remarque: Les symboles? et: apparaissent ensemble dans une expression conditionnelle. Ils forment un opérateur conditionnel et aussi appelé un opérateur ternaire car il utilise trois opérandes. Il est le seul opérateur ternaire en Java.

cité de: Introduction à la programmation Java 10ème édition par la page Y. Daniel Liang 126-127

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top