WTF x==y==z ??? - страница 3

 
Vinin:
А в баньку я бы двоих отправил (Может тогда и мне отпуск дадут).

Вот только не надо лицемерить. Никто вас насильно на должности не держит. И модерировать не заставляет.

Хотите забанить -- забаньте и успокойтесь, я уже привыкши.

 

Я так понимаю, что конструкция  if (x == y == z)  означает следующее.

Имеем два оператора сравнения, значит, они выполняются по порядку.

Сперва выполняется оператор x==y и получается результат true

После чего выполняется оператор true == z 

Здесь все зависит от того, к какому типу будет приведены величины. Но, на мой взгляд, хоть значения будут приводиться к bool, хоть к int - в любом случае результат должен быть одинаков и для 12 и для 12000

Почему 12 и 12000 работают по-разному, я не пойму.

Все-таки, здесь баг.

(Хотя, еще раз повторю - подобные конструкции в языке - "багогенерирующи", и им нет места в нормальном коде). 

 

у меня не воспроизводится. всегда false.

void OnStart()
{
        int x = 10;
        int y = 10;
        int r = 0;
        for (int z=12; z<=12000; z*=10) 
        {
                if (x==y==z) r=1; else r=0;
                Print("x=",x," y=",y," z=",z," r=",r);
        }
}

2013.03.17 13:11:07    qqwwee (AUDCAD,H1)    x=10 y=10 z=12000 r=0
2013.03.17 13:11:07    qqwwee (AUDCAD,H1)    x=10 y=10 z=1200 r=0
2013.03.17 13:11:07    qqwwee (AUDCAD,H1)    x=10 y=10 z=120 r=0
2013.03.17 13:11:07    qqwwee (AUDCAD,H1)    x=10 y=10 z=12 r=0

 

Забавно, компилятор цуко хитрый :)

         int x = 10;
         int y = 10;
         int z = 12;
        
         if (x == y == z)

Похоже оптимизируется, переменные заменяются постоянными значениями, тип теряется,

(true == z) при z не больше 1байта - сравнивнение логическое, если больше - целых чисел.

 
sergeev:

у меня не воспроизводится. всегда false.

2013.03.17 13:11:07    qqwwee (AUDCAD,H1)    x=10 y=10 z=12000 r=0
2013.03.17 13:11:07    qqwwee (AUDCAD,H1)    x=10 y=10 z=1200 r=0
2013.03.17 13:11:07    qqwwee (AUDCAD,H1)    x=10 y=10 z=120 r=0
2013.03.17 13:11:07    qqwwee (AUDCAD,H1)    x=10 y=10 z=12 r=0

А у вас с топикстартером битность компилятора наверняка разная.

 
sergeev:

у меня не воспроизводится. всегда false.

Нужно цикл убрать и все получится.

void OnStart()
  {
  int r;
  int x=12000;
  int y=12000;
  
  int z=12;
  if(x==y==z)r=1; else r=0; Print("x=",x," y=",y," z=",z," r=",r);

  z=12000;
  if(x==y==z)r=1; else r=0; Print("x=",x," y=",y," z=",z," r=",r);
  }
x=12000 y=12000 z=12000 r=0
x=12000 y=12000 z=12 r=1
 
MetaDriver:

А у вас с топикстартером битность компилятора наверняка разная.

не, тестировал 32/64.

оба false

 
victorg:

Нужно цикл убрать и все получится.

ну таки явно же налицо приведение к bool типу

void OnStart()
{
  int r=0;
  int x=10;
  int y=10;
  
  int z=10;
  if(x==y==z)r=1; else r=0; Print("x=",x," y=",y," z=",z," r=",r);

  z=128;
  if(x==y==z)r=1; else r=0; Print("x=",x," y=",y," z=",z," r=",r);


2013.03.17 15:45:24    qqwwee (AUDCAD,H1)    x=10 y=10 z=128 r=0
2013.03.17 15:45:24    qqwwee (AUDCAD,H1)    x=10 y=10 z=10 r=1
2013.03.17 15:45:21    qqwwee (AUDCAD,H1)    x=10 y=10 z=127 r=1
2013.03.17 15:45:21    qqwwee (AUDCAD,H1)    x=10 y=10 z=10 r=1

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

В примере сергеева с циклом все правильно, ибо там компилятор не делает полной оптимизации.
 

И с такой конструкцией x = y = z тоже надо разобраться.