Добрый день!
Уважаемые, подскажите пожалуйста, в чем проблемы — моим знанием С++ или с особенностями компилятора ? Есть один код — идея взята с неудачной попытки взлома на сегодняшнем 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;
}
Подсказка -результат работы компилятора тут Почему так, подскажите ?
UB ХКТТБ.
Вы ничего не возвращаете из функции
Чуть подробнее: Произойти может что угодно. Например вернуться последний использованный вектор. Или пустой. Или вообще некорректный. Или метеорит упасть, если компилятор умеет так делать.
Именно! Тогда почему значение всё таки возвращается ?
Часто бывает, что возвращается последнее используемое значение.
Я тоже так ответил себе при нажатии на кнопку "challenge". И уже через мгновение получил новые знания о языке)
UB это не значит, что так, как надо не произойдет
Код написанный по образу и подобию увиденного. И Вы верно заметили. Тогда, может, проясните результат вывода ?
Ага, и именно по воле священного рандома код прошел все тесты ?
Ну более менее естественно, что при компиляции одного и того же кода на одном и том же компиляторе на одной и той же(или идентичной) машине происходит одно и тоже.
Другой вопрос, что никто не заставлял компилятор компилировать именно так. Тогда бы не повезло сабмиттеру а не Вам
Код компилировался и запускался на разных машинах (ТК, ideone, мой ПК, и ПК сабмитера) везде результат идентичен. Но тот же код, но без конструкции if-else, получает ожидаемый RE.
Запуск на ideone
А хотя бы без -O2 пробовал запускать? У меня 2005 студия в дебаге честно говорит при запуске Access violation, а в релизе с отключенным O2 выводится куча мусора.
Согласно стандарту, это UB. Так что, можно не удивляться, что работает, или что не работает.