Операторский приоритет и тернарный оператор

У меня проблема в C.

#include<stdio.h>
int main()
{
    int a = 10, b = 0, c = 7;
    if (a ? b : c == 0)
        printf("1");
    else if (c = c || a && b)
        printf("2");
    return 0;
}

Этот код печатает 2, но я думаю, что a? b: c возвращает b = 0 и 0 == 0 возвращает 1. Можете ли вы объяснить код?

Ответ 1

Ваши условия написаны неправильно.

В первом операторе if:

  if (a ? b : c == 0)

если вы поместите значения, тогда он станет

if(10 ? 0 : 7 == 0)

означает, что он всегда будет возвращать 0.

Вот почему управление переходит к части else и там, оно становится

else if (7 = 7 || 10 && 0)

так как вы использовали здесь оператор "=" (c = c), он всегда будет правдой, поэтому он печатает "2".

Теперь вы хотите, чтобы этот код возвращал "1", а затем изменил оператор if таким образом.

 if( (a ? b:c) == 0){...}

потому что оператор "==" имеет более высокий приоритет, чем тернарный оператор.

Ответ 2

Условный оператор (?:) имеет одно из самых низких приоритетов. В частности, он меньше, чем ==. Ваше выражение означает следующее:

if(a ? b : (c == 0)) { ... }

Не это:

if((a ? b : c) == 0) { ... }