Присваивание со сложением в substring

ant1fr1z
Offline
Зарегистрирован: 08.01.2019

Поясните почему не работает данный код

  Serial.begin(9600);
  int pos = 0;
  String string = "0123456789";
  Serial.println(string.substring(pos, pos+=2));

Если первый аргумент в substring - 0, все хорошо, но почему не работает в таком виде.

Сначала происходит присваивание, а потом выполнение функции substring? Разделить переменную pos на две start, end?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

наерна нада 

Serial.println(string.substring(pos, pos+2))

ant1fr1z
Offline
Зарегистрирован: 08.01.2019

DetSimen пишет:

наерна нада 

Serial.println(string.substring(pos, pos+2))

а переменную pos увеличивать в следующей отдельной строке?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ant1fr1z,

нафиг такие конструкции, нафиг от слова нах!

Запомните, порядок вычисления аргументов функции в языке НЕОПРЕДЕЛЁН. Это означает, что разные компиляторы (или разные версии одного) имеют право вычислять аргументы как справа налево, так и слева направо, или вообще в произвольном порядке. А если Вы компилируете для многоядерной системы, они имеют право сгенерировать их (аргументов) параллельное вычисление.

Поэтому, даже, если в конкретном компиляторе вдруг заработает так, как Вам надо - это случайность, поменяете компилятор (или его версию) и приплыли - ищите потом эти грабли, когда "всё ведь работало!".

Так, что не выпедривайтесь и ВСЕГДА, ТЩАТЕЛЬНО ИЗБЕГАЙТЕ ПОБОЧНЫХ ЭФФЕКТОВ В АРГУМЕНТАХ!

b707
Offline
Зарегистрирован: 26.05.2017

ant1fr1z пишет:

Поясните почему не работает данный код

  Serial.begin(9600);
  int pos = 0;
  String string = "0123456789";
  Serial.println(string.substring(pos, pos+=2));

Если первый аргумент в substring - 0, все хорошо, но почему не работает в таком виде.

а если второй аргумент в скобки заключить - не заработает? (хотя в целом поддерживаю Евгения)

Serial.println(string.substring(pos, (pos+=2)));

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Формально, С передает параметры в функцию справа налево, поэтому может случица так, что pos+=2 будет вычислено первым, соотвецтвенно второй pos передасца не тот, что думает ТС

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

а если второй аргумент в скобки заключить - не заработает? (хотя в целом поддерживаю Евгения)

Поймите, порядок неопределён. Об этом прямо сказано в стандарте языка - undefined. Поэтому, какая разница в кобках второй параметр или нет - он может вычисляться раньше первого или позже, и параллельно для многоядерных дел. И чем тут скобки помогут?

Заработать может случайно, до следующей версии компилятора или даже до других опций компилятора/оптимизатора.

ant1fr1z
Offline
Зарегистрирован: 08.01.2019

Спасибо за пояснения, буду делать это так

Serial.println(string.substring(pos, pos+2));
pos+=2;