Я писал консольное приложение, которое пыталось бы «угадать» число методом проб и ошибок, оно работало нормально и все, но это заставило меня задуматься об определенной части, которую я написал рассеянно,
Код:
#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)
, похоже, работает правильно, но есть ли риск оставить эту часть условного пустым?