?: троичное поведение условного оператора при оставлении одного выражения пустым

Я писал консольное приложение, которое попытается "предположить" число методом проб и ошибок, оно хорошо работало, и все кроме него оставили меня задающийся вопросом об определенной части, которую я записал рассеянно,

Код:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x,i,a,cc;
    for(;;){
    scanf("%d",&x);
    a=50;
    i=100/a;
for(cc=0;;cc++)
{
    if(x<a)
    {
        printf("%d was too big\n",a);
        a=a-((100/(i<<=1))?:1);

    }
    else if (x>a)
    {
        printf("%d was too small\n",a);
        a=a+((100/(i<<=1))?:1);

    }
    else
    {
        printf("%d was the right number\n-----------------%d---------------------\n",a,cc);
        break;
    }
}
}
return 0;
}

Более конкретно часть, которая смутила меня,

a=a+((100/(i<<=1))?:1); 
//Code, code
a=a-((100/(i<<=1))?:1);

Я использовал ((100/(i<<=1))?:1) удостоверяться это если 100/(i<<=1) возвращенный 0 (или ложь) целое выражение оценило бы к 1 ((100/(i<<=1))?:***1***), и я оставил часть условного выражения, которое работало бы, если бы это было верно пустой ((100/(i<<=1))? _this space_ :1), это, кажется, работает правильно, но является там каким-либо риском в отъезде той части пустого условного выражения?

37
задан dbush 4 August 2016 в 20:48
поделиться

2 ответа

Это расширение GNU C (см. ?: wikipedia entry), поэтому для переносимости следует явно указать второй операнд.

В случае 'true' возвращается результат условного условия.

Следующие утверждения почти эквивалентны:

a = x ?: y;
a = x ? x : y;

Единственное различие в том, что в первом утверждении x всегда оценивается один раз, тогда как во втором x будет оценен дважды, если он истинен. Так что единственное различие - это когда оценка x имеет побочные эффекты.

В любом случае, я бы счел это тонким использованием синтаксиса... и если у вас есть хоть капля сочувствия к тем, кто сопровождает ваш код, вы должны явно указать операнд. :)

С другой стороны, это хороший маленький трюк для распространенного случая использования.

58
ответ дан 27 November 2019 в 04:31
поделиться

Это расширение GCC для языка C. Когда между ?: ничего не появляется, то значение сравнения используется в истинном случае.

Средний операнд в условном выражении может быть опущен. Тогда, если первый операнд ненулевой, его значение будет значением условного выражения.

Поэтому выражение

x ? : y

имеет значение x, если оно ненулевое, в противном случае - значение y.

Этот пример совершенно эквивалентен

x ? x : y

В этом простом случае возможность опустить средний операнд не особенно полезна. Она становится полезной, когда первый операнд содержит или может содержать (если это макроаргумент) побочный эффект. Тогда повторение операнда в середине выполнит побочный эффект дважды. Опуская средний операнд, вы используете уже вычисленное значение без нежелательных последствий повторного вычисления.

19
ответ дан 27 November 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: