Блог пользователя konstantin.lex

Автор konstantin.lex, 12 лет назад, По-русски

Добрый день!

Уважаемые, подскажите пожалуйста, в чем проблемы — моим знанием С++ или с особенностями компилятора ? Есть один код — идея взята с неудачной попытки взлома на сегодняшнем SRM . Что будет на выводе ?

#include <vector>
#include <iostream>
using namespace std;
vector<int> strainge_func(vector<int> data){
        vector<int> res;
        if(1){
                res = data;
                res.push_back(123);
        }
        else return res;
}
int main(){
        vector<int> data;
        data.push_back(1);
        data.push_back(2);
        data.push_back(3);
        vector<int> test = strainge_func(data);
        for (int i=0;i<test.size();++i)
                cout<<test [i]<<endl;
        return 0;
}


Подсказка -результат работы компилятора тут Почему так, подскажите ?

Теги c++, g++
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +11 Проголосовать: не нравится

UB ХКТТБ.

Вы ничего не возвращаете из функции

Чуть подробнее: Произойти может что угодно. Например вернуться последний использованный вектор. Или пустой. Или вообще некорректный. Или метеорит упасть, если компилятор умеет так делать.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    Именно! Тогда почему значение всё таки возвращается ?

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Часто бывает, что возвращается последнее используемое значение.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Я тоже так ответил себе при нажатии на кнопку "challenge". И уже через мгновение получил новые знания о языке)

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Код написанный по образу и подобию увиденного. И Вы верно заметили. Тогда, может, проясните результат вывода ?

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

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

    Ага, и именно по воле священного рандома код прошел все тесты ?

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Ну более менее естественно, что при компиляции одного и того же кода на одном и том же компиляторе на одной и той же(или идентичной) машине происходит одно и тоже.

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

      • »
        »
        »
        »
        12 лет назад, # ^ |
        Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

        Код компилировался и запускался на разных машинах (ТК, ideone, мой ПК, и ПК сабмитера) везде результат идентичен. Но тот же код, но без конструкции if-else, получает ожидаемый RE.

        #include <vector>
        #include <iostream>
        using namespace std;
        vector<int> strainge_func(vector<int> data){
                vector<int> res;
                res = data;
                res.push_back(123);
        }
        int main(){
                vector<int> data;
                data.push_back(1);
                data.push_back(2);
                data.push_back(3);
                vector<int> test = strainge_func(data);
                for (int i=0;i<test.size();++i)
                        cout<<test [i]<<endl;
                return 0;
        }
        

        Запуск на ideone

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          Код компилировался и запускался на разных машинах (ТК, ideone, мой ПК, и ПК сабмитера) везде результат идентичен.

          А хотя бы без -O2 пробовал запускать? У меня 2005 студия в дебаге честно говорит при запуске Access violation, а в релизе с отключенным O2 выводится куча мусора.

»
11 лет назад, # |
  Проголосовать: нравится -13 Проголосовать: не нравится

Согласно стандарту, это UB. Так что, можно не удивляться, что работает, или что не работает.