0

I have an exam at uni from C and I was looking through the exams from the previous years and I stumbled over this problem: What is the value of d after executing the following sequence?

int a=36, b=20, c=30, d;
d = c?(a? a: c):(b? c: b);

There was another exercise like this, but in those parenthesis there were other expressions:

d = (a>b) ? ((a>c)? a: c): ((b>c)? b: c);

I put the 2 codes in ChatGPT and it told me that they are called ternary operators.

I understand that in the second example we are comparing a with b, a with c, b with c, then we are giving d a value based on the comparisons. But in the first example, there are no comparisons, only variables. Moreover, the test will be on paper, so I won't be able to run the code on a computer. How do I read the syntax of the first example, what does it mean? Am I still comparing the 3 variables, or is it something different?

I ran the codes on CodeBlocks and on VS for both exercises, with the same values (a = 36, b = 20, c = 30), and they both gave me the same answer:

d = (a>b) ? ((a>c)? a: c): ((b>c)? b: c); //d = 36

and

d = c?(a? a: c):(b? c: b); //d was still 36.

I don't understand how did I get that answer from the second exercise.

Donald Duck
  • 8,409
  • 22
  • 75
  • 99
AndrewN
  • 29
  • 2
  • Do you know how C determines whether an expression is "true" or "false"? Do you know *exactly* what the `>` operator does? You know what `if(a > b)` does. Do you know what `if(a)` does? – Steve Summit Jan 14 '23 at 16:30
  • Which is "second"? You have them both ways around. Remember that any non-zero value is `true`. So with those values, `a`, `b` and `c` are all `true`. – Weather Vane Jan 14 '23 at 16:30
  • The truth value used in a `?:` expression is the same as the truth value used in an `if` or `while` statement. The value being tested is compared to zero. So `if (a)` is equivalent to `if (a != 0)`. Similarly, `a ? b : c` is equivalent to `a != 0 ? b : c`. – Tom Karzes Jan 14 '23 at 16:35

2 Answers2

0

This is the conditional operator; it selects its second or third operand based on its first operand, which is a condition. It is a ternary operator; it has three operands. (But so does the function call f(a, b), with operands f, a, and b.) Do not use ChatGPT for authoritative information.

C 2018 6.5.15 4 specifies the conditional operator:

The first operand is evaluated… The second operand is evaluated only if the first compares unequal to 0; the third operand is evaluated only if the first compares equal to 0; the result is the value of the second or third operand (whichever is evaluated), converted to the type described below.

Thus, in c?(a? a: c):(b? c: b), c is evaluated, and the conditional operation proceeds:

  • If c is not zero, (a? a: c) is evaluated. This operation proceeds:
    • If a is not zero, a is evaluated.
    • If a is zero, c is evaluated.
  • If c is zero, (b? c: b) is evaluated.
    • If b is not zero, c is evaluated.
    • If b is zero, b is evaluated.

Evaluation of an object identifier (a, b, or c) simply produces its value. Since c is not zero, (a? a: c) is selected. Since a is not zero, a is selected. a is 36.

Eric Postpischil
  • 195,579
  • 13
  • 168
  • 312
0

The first ternary statement:

d = c?(a? a: c):(b? c: b);

is equivalent to this series of if-else:

if (c) {       /* c is non-zero */
    if (a)     /* a is non-zero */
        d = a;
    else   
        d = c;
} else { 
    if (b)     /* b is non-zero */
        d = c;
    else   
        d = b;
}

The second one:

d = (a>b) ? ((a>c)? a: c): ((b>c)? b: c);

is equivalent to this series of if-else:

if (a > b) {
    if (a > c) 
        d = a;
    else 
        d = c;
} else {
    if (b > c) 
        d = b;
    else 
        d = c;
}

Some notes:

  1. if (a) is equivalent to if (a != 0).
  2. if (!a) is equivalent to if (a == 0.
  3. The if statement considers any non-zero value to be true, and zero to be false. The block is only entered if the conditional expression evaluates to a non-zero value.
Harith
  • 4,663
  • 1
  • 5
  • 20