147

Two questions about using a question mark "?" and colon ":" operator within the parentheses of a print function: What do they do? Also, does anyone know the standard term for them or where I can find more information on their use? I've read that they are similar to an 'if' 'else' statement.

int row = 10;
int column;
while (row >= 1)
{
    column = 1;
    while(column <= 10)
    {
        System.out.print(row % 2 == 1 ? "<" : "\r>");
        ++column;
    }
    --row;
    System.out.println();
}
Artjom B.
  • 61,146
  • 24
  • 125
  • 222
Deepend
  • 4,057
  • 17
  • 60
  • 101

7 Answers7

321

This is the ternary conditional operator, which can be used anywhere, not just the print statement. It's sometimes just called "the ternary operator", but it's not the only ternary operator, just the most common one.

Here's a good example from Wikipedia demonstrating how it works:

A traditional if-else construct in C, Java and JavaScript is written:

if (a > b) {
    result = x;
} else {
    result = y;
}

This can be rewritten as the following statement:

result = a > b ? x : y;

Basically it takes the form:

boolean statement ? true result : false result;

So if the boolean statement is true, you get the first part, and if it's false you get the second one.

Try these if that still doesn't make sense:

System.out.println(true ? "true!" : "false.");
System.out.println(false ? "true!" : "false.");
Community
  • 1
  • 1
Brendan Long
  • 53,280
  • 21
  • 146
  • 188
  • 7
    Ternary operator refers to any operator with three parameters, thus this is *a* ternary operator but not *the* ternary operator. Major languages (C#, Java, PHP) consider it *a* conditional operator, and call it *the* ?: operator. Occasionally (JavaScript) it is called *the* conditional operator. – Sheepy May 30 '14 at 08:02
  • Is there any difference regarding performance? I personally find the classical version far easier to read - especially when `x` and `y` are again function calls. – Cleb Nov 30 '18 at 07:29
  • 1
    @Cleb Theoretically there's no difference, but compilers may optimize the two statements differently (making different assumptions about branch prediction). Most people don't need to worry about that level of optimization, and if you do, you probably want to use attributes like `__builtin_expect` anyway. – Brendan Long Dec 04 '18 at 17:40
10

Thats an if/else statement equilavent to

if(row % 2 == 1){
  System.out.print("<");
}else{
  System.out.print("\r>");
}
fmucar
  • 14,361
  • 2
  • 45
  • 50
4

Also just though I'd post the answer to another related question I had,

a = x ? : y;

Is equivalent to:

a = x ? x : y;

If x is false or null then the value of y is taken.

moo moo
  • 301
  • 3
  • 4
4
a=1;
b=2;

x=3;
y=4;

answer = a > b ? x : y;

answer=4 since the condition is false it takes y value.

A question mark (?)
. The value to use if the condition is true

A colon (:)
. The value to use if the condition is false

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
rbe
  • 41
  • 1
  • To me, your answer was the only one that made sense based on how you laid it out. So thank you and I have republished your answer with a citation. https://garrett.ms/2019/07/24/understanding-question-mark-and-colon-operators-in-java-programming/ – Cody Jul 24 '19 at 19:20
3

Maybe It can be perfect example for Android, For example:

void setWaitScreen(boolean set) {
    findViewById(R.id.screen_main).setVisibility(
            set ? View.GONE : View.VISIBLE);
    findViewById(R.id.screen_wait).setVisibility(
            set ? View.VISIBLE : View.GONE);
}
mehmet
  • 1,558
  • 5
  • 30
  • 41
1

They are called the ternary operator since they are the only one in Java.

The difference to the if...else construct is, that they return something, and this something can be anything:

  int k = a > b ? 7 : 8; 
  String s = (foobar.isEmpty ()) ? "empty" : foobar.toString (); 
user unknown
  • 35,537
  • 11
  • 75
  • 121
  • Is it possible to call function after 7 or 8 ? for example if a>7 type 7 then execute other function. – Menai Ala Eddine - Aladdin Nov 25 '19 at 22:13
  • Do you mean "print 7" with "type 7"? Why don't you try it out? The Java jargon uses the expression method, not functions - in other contexts there is the distinction of function and procedure, dependent on the existence of a return type, which is required in a ternary expression. Afaik, you can call a function which, after printing, returns a value. – user unknown Nov 25 '19 at 22:33
1

it is a ternary operator and in simple english it states "if row%2 is equal to 1 then return < else return /r"

Anurag Ramdasan
  • 4,189
  • 4
  • 31
  • 53