2014-10-08 3 views
1

Почему последняя версия else пропущена следующим способом в VS C++? Я правильно перегрузил оператора <, поэтому проблем там нет. Фактически, когда я беру эту ту же функцию и перекомпилирую ее в XCode, она делает то, что, как полагают, отлично, когда выполняется оператор else. Почему это ?Пропуск инструкции else в Visual Studio C++?

void insert(Comparable & x, BinaryNode * & t) 
     { 
      if (t == nullptr) 
       t = new BinaryNode{ x, nullptr, nullptr }; 
      else if (x < (t->element)) 
       insert(x, t->left); 
      else if ((t->element) < x) 
       insert(x, t->right); 
      else 
       t->element.merge(x.getEnzymes()); 
     } 
+0

Вы всегда можете добавить еще одно, если, так как есть только один другой сценарий. – boomoto

+0

Нам нужно достаточно кода, чтобы воспроизвести проблему. Можете ли вы создать [SSCCE] (http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions)? –

+0

«Я правильно перегрузил' <'operator - вы уверены, что это правильно? Мы можем это увидеть? Более того, можно ли увидеть полный (но минимальный) тестовый пример, чтобы продемонстрировать вашу проблему? –

ответ

0

Похоже, что оптимизация кода. C++ любит «переопроверять» его, и если он думает, что это еще никогда не пострадает, тогда он даже не будет компилировать эту часть кода. Также добавьте {} для каждого if. Парсеру проще разобрать эти операторы if. И вы можете разбить его на совершенно отдельный ifs.

+0

Оптимизация кода не влияет на поведение кода. если он делает это ошибка компилятора (оптимизация returnvalue является единственным исключением из этого правила) –

+2

На самом деле это так. –

+4

@SashaGlover: На самом деле что делает что? Помимо копирования/перемещения elision (который здесь не применяется), оптимизация должна следовать правилу «как есть» и производить то же поведение, что и неоптимизированный код. Если поведение изменяется из-за оптимизации, то компилятор не работает. –