Подтвердить что ты не робот

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

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

Код:

#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 (или false), все выражение будет оцениваться до 1 ((100/(i<<=1))?:***1***), и я оставил часть условного выражения, которое будет работать, если оно было истинным пустым ((100/(i<<=1))? _this space_ :1), он работает правильно, но существует ли риск оставить эту часть условного пустого?

4b9b3361

Ответ 1

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

В "истинном" случае он возвращает результат условного выражения.

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

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

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

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

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

Ответ 2

Это расширение