Блог пользователя I_love_Codechef

Автор I_love_Codechef, история, 3 года назад, По-русски

Всем привет! Сегодня я столкнулся с ошибкой при использований map в C++.

Мой код который получил WA 1 имел строку: cost[x] = (cost.find(x) == cost.end() ? c : min(cost[x], c));
Я этот код переписал через if и получил AC: if(cost.find(x) == cost.end())cost[x] = c; else cost[x] = min(cost[x], c);

Может кто нибудь обьяснить почему так получился?

  • Проголосовать: нравится
  • +34
  • Проголосовать: не нравится

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

Интересно, что отправляя под GNU C++17, тот же код дает OK

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

cost[x]= — если эта часть выражения выполняется раньше чем другая, то элемент добавляется в мапу и логика не верна. До c++17 порядок вычисления аргументов в таком выражении произволен, так что это UB.