255

I came across the following line

hsb.s = max != 0 ? 255 * delta / max : 0;

What do the ? and : mean in this context?

T.J. Crowder
  • 879,024
  • 165
  • 1,615
  • 1,639
Inaimathi
  • 13,314
  • 7
  • 43
  • 87

7 Answers7

369

It is called the Conditional Operator (which is a ternary operator).

It has the form of: condition ? value-if-true : value-if-false
Think of the ? as "then" and : as "else".

Your code is equivalent to

if (max != 0)
  hsb.s = 255 * delta / max;
else
  hsb.s = 0;
Felix Kling
  • 705,106
  • 160
  • 1,004
  • 1,072
Greg
  • 21,917
  • 11
  • 55
  • 77
  • 28
    "?" isn't the ternary operator; "? :" is the ternary operator. Talking about "?" as the ternary operator is like talking about Abbott without Costello, Laurel without Hardy, Cheech without Chong.... – Jason S Nov 20 '09 at 17:11
  • 11
    Ok, ok... now I'm using an ambiguous pronoun, happy? :) – Greg Nov 20 '09 at 17:16
  • 16
    To be pedantic, it's **a** ternary operator, which happens to be the only one in most programming languages. Any operator that works on 3 parts is a ternary operator, just like `addition` is a binary operator that operates on the preceding and following expressions (e.g. 1+2 the plus operates on 1 and 2), or negation is a unary operator (e.g. -x where the value of x is negated). – Davy8 Aug 15 '11 at 18:56
  • 7
    @Davy8: And this one can be called the [tag:conditional-operator] to be specific. – Mechanical snail Aug 14 '12 at 01:02
  • What if you wanted to check two conditions? – Thanos Dodd Apr 12 '20 at 07:49
  • @ThanosDodd - Use nesting, or use `if`/`else if`/`else` instead. – T.J. Crowder Jan 19 '21 at 17:20
39

Properly parenthesized for clarity, it is

hsb.s = (max != 0) ? (255 * delta / max) : 0;

meaning return either

  • 255*delta/max if max != 0
  • 0 if max == 0
Jason S
  • 171,795
  • 155
  • 551
  • 900
7

This is probably a bit clearer when written with brackets as follows:

hsb.s = (max != 0) ? (255 * delta / max) : 0;

What it does is evaluate the part in the first brackets. If the result is true then the part after the ? and before the : is returned. If it is false, then what follows the : is returned.

Nikolas Stephan
  • 1,240
  • 12
  • 10
7
hsb.s = max != 0 ? 255 * delta / max : 0;

? is a ternary operator. It works like an if in conjunction with the :

!= means not equals

So, the long form of this line would be

if (max != 0) { //if max is not zero
  hsb.s = 255 * delta / max;
} else {
  hsb.s = 0;
}
Pang
  • 8,605
  • 144
  • 77
  • 113
CaffGeek
  • 20,889
  • 16
  • 95
  • 176
1

? : isn't this the ternary operator?

var x= expression ? true:false

jldupont
  • 82,560
  • 49
  • 190
  • 305
  • 3
    That's one example of its use, but there's actually a shorter version of your statement, for those cases where you just want TRUE / FALSE: If 'expression' was just some variable with a number or string in it, "var x = !!expression" will make it into a boolean result. – Scott Lahteine Jan 04 '12 at 23:15
1

?: is a short-hand condition for else {} and if(){} problems. So your code is interchangeable to this:

if(max != 0){
       hsb.s = 225 * delta / max
}
else {
       hsb.s = 0
}

MDN - Conditional (Ternary) Operator

-3

Be careful with this. A -1 evaluates to true although -1 != true and -1 != false. Trust me, I've seen it happen.

so

-1 ? "true side" : "false side"

evaluates to "true side"

MEB
  • 45
  • 5
  • 3
    "In JavaScript, a **truthy** value is a value that is considered true when evaluated in a Boolean context. All values are truthy unless they are defined as falsy (i.e., except for false, 0, "", null, undefined, and NaN)." This is why -1 is evaluated as true. (https://developer.mozilla.org/en-US/docs/Glossary/Truthy) – jobmo Sep 29 '17 at 10:29