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

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

Доброе временя суток друзья. На днях столкнулся с такой проблем.

while(cin >> s[n])
    len[n] = len[n - 1] + 1 + s[n++].length();

Но всего проходило 0 тестов, потом же исправил на следующую запись.

while(cin >> s[n])
    len[n] = len[n - 1] + 1 + s[n].length(), n++;

Получил AC. Какая разница между этими кодами? Может это из-за компиляторов? Заранее спасибо. :)

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

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

Порядок вычисления аргументов в языке C++ не фиксирован. Как следствие n++ может случится как до len[n] и len[n-1], так и после, так и между.

По моим представлениям на g++ например он случится перед.

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

    У меня gcc, он сначала присваивает значение len[n] и только потом выполняет n++.

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

      Ну это может меняться от версии. В любом случае вашему коду надо сделать следующий набор действий

      1. Посчитать указатель len[n]
      2. Посчитать указатель len[n-1]
      3. Посчитать 1.
      4. Посчитать s[n].length().
      5. Сделать n++.
      6. Сложить len[n-1], 1, s[n].length()
      7. Присвоить все это в len[n].

      Компилятор имеет право переставлять эти действия почти как угодно. (ну не совсем конечно, но порядок 4,5,3,2,1,6,7 вполне валиден и правдоподбен).

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

        Ясно, все понял, спасибо большое. Надо бы избегать такие ляпы :)

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

      http://alenacpp.blogspot.ru/2005/11/sequence-points.html

      Здесь достаточно внятно и хорошо описана эта тема, то, чего следует ожидать, и чего не следует ожидать от компилятора.