LINUX.ORG.RU

Разница между +1 и ++ в PHP


0

2

Не пойму в чем разница, вроде одно и тоже, но результат с массивами разный.
Например, если написать:

<?php
$img = array("0.png","1.png","2.png","3.png");
print_r($img);
$count = count($img);
$nextimg = $count++;
echo "<br>".$nextimg.".png"."<br>";
?>
То вывод будет верным и имя следующего изображения 4.png, но если написать так:
<?php
$img = array("0.png","1.png","2.png","3.png");
print_r($img);
$count = count($img);
$nextimg = $count+1;
echo "<br>".$nextimg.".png"."<br>";
?>
То вывод неверен, следующее изображение 5.png
В чем причина?

Вот всегда хотелось оторвать руки за строчки типа
nextimg = count++;

count++;
nextimg = count;

чего вот так вот не пишется, никаких разночтений

ilovewindows ★★★★★
()

http://php.net/manual/en/language.operators.increment.php

$a++ Post-increment Returns $a, then increments $a by one.

Потому что надо ознакомится с языком прежде чем на нём писать.

И да, заключать в двойные кавычки строку не требующую подстановки значений переменных - роскошество быдлокодера

anonymous
()

В оператора val++ приоритет низкий, т.е. он сначал отдаст своё значения, и лишь потом инкрементируется. В разных ЯП (как в похапе я хз) обычно можно юзать ++val, тогда поведение обратное, сначала инкрементация...

erfea ★★★★★
()
Ответ на: комментарий от ilovewindows

Вот всегда хотелось оторвать руки за строчки типа...

Это ещё почему?! Если правильно юзать, ничего плохого не случается.

erfea ★★★★★
()

$count = count($img); // тут $count равен 4

$nextimg = $count++; // Эта строка означает: присвоить $nextimg значение $count (то есть 4), а потом $count увеличить на 1 (станет $count=5)

$nextimg = $count+1; // эта строка означает: присвоить $nextimg значение $count, увеличенное на 1. $count остаётся неизменной

$nextimg = ++$count; // Эта строка означает: $count увеличить на 1 (станет $count=5) , а потом присвоить $nextimg значение $count (то есть 5)

google://php операции с числами

Slavaz ★★★★★
()
Ответ на: комментарий от erfea

В оператора val++ приоритет низкий, т.е. он сначал отдаст своё значения, и лишь потом инкрементируется.

При чем здесь приоритет?

anonymous
()
Ответ на: комментарий от vladmenshikov

то есть, нулевой элемент массива превращается в еденичку и система отсчета в count без нуля?

На столе в ряд лежат яблоки. Под каждым подписан его номер, начиная с 0 и до 3. Сколько яблок на столе?

Dragon59 ★★
()
Ответ на: комментарий от anonymous

При том, что сначала выполняются другие операции, а потом уже инкрементация. В ЯП обычно у этого оператора низкий приоритет.

erfea ★★★★★
()
Ответ на: комментарий от erfea

Потому как постоянный источник ошибок, все равно как под крышей с сосульками гулять и думать про свою внимательность и ловкость.

ilovewindows ★★★★★
()
Ответ на: комментарий от vladmenshikov

Это ты по-прежнему не понимаешь. $nextimg = $count++; Сначала присваивает, потом инкрементирует.

$nextimg = $count+1; наоборот, сначала прибавляет (не меняя значения $count притом), потом присваивает.

А разделять строки надо для читаемости и чтобы избежать тупняков, man ++i + ++i

Kalashnikov ★★★
()
Ответ на: комментарий от vladmenshikov

то есть, нулевой элемент массива превращается в еденичку и система отсчета в count без нуля?

count - это кол-во, а не индекс последнего элемента.

Вы напутали, все наоборот ++ возврашает верно 4.png а +1 неверно 5.png

Убери опреатор ++, в твоём говнокоде ничего не изменится...

erfea ★★★★★
()
Ответ на: комментарий от ilovewindows

Потому как постоянный источник ошибок, все равно как под крышей с сосульками гулять и думать про свою внимательность и ловкость.

Вообще-то здесь источником ошибок выступает криворукость быдлокодера. Если кодер понимает что делает оператор, ошибок он не допустит. Пример с сосульками не в тему.

erfea ★★★★★
()
Ответ на: комментарий от erfea

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

anonymous
()
Ответ на: комментарий от vladmenshikov

count возвращает число элементов в массиве (0 для пустого, 1 для 1 элемента и т.д.), а не порядковый номер (который от нуля считается) последнего

marvin_yorke ★★★
()
Ответ на: комментарий от redgremlin

Ладно блин придрались... не суть. ЯП в котором я последний вникал в приоритеты, сабж шёл с низким... Может и путаю как в общей массе, не суть. В любом случае суть оператора в том, что сначала вычисляется всё и только потом меняется значение переменной.

erfea ★★★★★
()

Верно конец света близится, коль обсуждения столь глубоких тем на Лоре.

Test11
()
Ответ на: комментарий от erfea

Это ещё почему?!

Это сишная боязнь. Там есть поведение, неопределённое по стандарту :)

a = a++ + ++a; — это стандартно работает во всех известных мне языках, проме Си/Си++ :)

И хотя конструкции, типа nextimg = count++; совершенно безопасны, стандартны и много лет используются на практике, у обжёгшихся на предыдущем варианте возникает баттхёрт :)

KRoN73 ★★★★★
()
Ответ на: комментарий от erfea

сабж шёл с низким...

Он никак не может идти с низким, в умножении $a++ * $b++ оба операнда должны быть определены, т.е. у ++ приоритет не может быть ниже умножения.

В любом случае суть оператора в том, что сначала вычисляется всё и только потом меняется значение переменной

Ничего подобного. Разберем $a=1; print $a++ + $a++;
Согласно порядку приоритетов, сначала выполняются операторы ++, потом результат складывается. Первый ++ возвращает значение $a (то есть 1) и увеличивает $a (a=2), второй ++ возвращает 2 и увеличивает $a до 3, т.о. print выводит 1+2, т.е 3, при этом значение $a равно 3 .

redgremlin ★★★★★
()
Ответ на: комментарий от ilovewindows

В первом случае тоже никаких разночтений быть не может. Как еще это можно прочитать кроме как «count -> nextimg, count + 1 -> count»? Руки нужно отрывать когда count с обеих сторон оператора присваивания.

urxvt ★★★★★
()

ТС, вообще пиши так

count++;
nextimg = count;

пусть тебя назовут трусом, перестраховщиком, старпером, но ты не будешь часами отлавливать ошибку. :)

ilovewindows ★★★★★
()

если b == a+1, то после инкремента (a++) a==b.
Т.е. инкремент дает следующее значение (именно следующее, а не +1. Это важно, т.к. если у тебя не число, а допустим список, то операция инкремента присвоит именно следующее значение списка)

Писать b= a++ все равно что написать

a= a+1
b =a
Зачем совершать 2 алгебраических действия, если можно уложиться в одно: b=a+1, и к тому же, при том переменная a останется без изменений

comp00 ★★★★
()
Ответ на: комментарий от Deleted

но пихать хитрожопость в код не стоит.

Что хитрого в простейшей операции, характерной для языка, строго описанной в стандарте?

KRoN73 ★★★★★
()
Ответ на: комментарий от comp00

Писать b= a++ все равно что написать

Только строчки местами поменять надо.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

В стандарте много чего описано, но когда для простого чтения нужно туда заглядывать «на всякий случай»… не. Это сейчас, пока пишешь, всё понятно, а потом, когда будешь баги искать, сиди гадай «что хотел сказать автор». Может он ошибся и хотел другое?

Это как с {} в if(). С одной командой можно их не ставить, но если пишешь в несколько строк, то лучше поставить во избежание.

Deleted
()
Ответ на: комментарий от KRoN73

a = a++ + ++a; — это стандартно работает во всех известных мне языках, проме Си/Си++ :)

А с чего бы это вдруг порядок вычисления слагаемых должен был бы совпадать с их порядком следования?

Как по мне, так логичней было бы сначала (++a) сделать, потом (a++) и потом сложить результаты.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Deleted

но когда для простого чтения нужно туда заглядывать «на всякий случай»

Ну какое ещё «на всякий случай» для var++??

KRoN73 ★★★★★
()
Последнее исправление: KRoN73 (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

А с чего бы это вдруг порядок вычисления слагаемых должен был бы совпадать с их порядком следования?

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

Как по мне, так логичней было бы сначала (++a) сделать, потом (a++) и потом сложить результаты.

Пиши свой язык, со своими стандартами.

KRoN73 ★★★★★
()
Ответ на: комментарий от Deleted

Это как с {} в if(). С одной командой можно их не ставить, но если пишешь в несколько строк, то лучше поставить во избежание.

Меня удручает уровень современных программистов. И эти люди ещё что-то про PHP говорят.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Ты помнишь все случаи, описанные в стандарте? Уверен, что помнишь их все и правильно? Зачем создавать себе проблемы?

Deleted
()
Ответ на: комментарий от KRoN73

Что сказать то хотел? Если ты привык писать код, который выглядит как говно, это одно, но других заставлять не надо.

Deleted
()
Ответ на: комментарий от Deleted

Ты помнишь все случаи, описанные в стандарте?

Ещё раз. Если такие банальные вещи вызывают у народа проблемы памяти, то мне печально за будущее программирования. Следующий этап — не помнить, что у умножения приоритет выше сложения и считать, что 2+2*2 == 8. На самом деле таких уже много, но программирование на Си, всё же, требует хотя бы минимального уровня знаний.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Ещё раз. Для чего ты так пишешь? Экономишь на переводе строки или хочется показать, что стандарт знаешь?

Deleted
()
Ответ на: комментарий от Deleted

Если ты привык писать код, который выглядит как говно, это одно, но других заставлять не надо.

Чую я, для вас скоро вызов тригонометрии какой-нибудь или работа с указателями «говном» будет скоро. OMFG...

«Как говно» пишут в массе неявных конструкций на Perl или Ruby. Но работа с инкрементами никогда не считалась write-only кодом.

Я очень глубоко скорблю.

KRoN73 ★★★★★
()
Ответ на: комментарий от Deleted

Для чего ты так пишешь?

Потому что это удобно, очевидно и однозначно. Соответствующая конструкция языка именно для такого использования и вводилась. Кстати, for ты тоже пишешь как (for int i = 0; i < 10; i = i + 1)?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Отлично. Чем

if (x)
    blahblah();
лучше
if (x) {
    blahblah();
}
? Когда настигнет человеческий фактор и кто-нибудь ошибётся вставив команду, будет очень интересно.

Deleted
()
Ответ на: комментарий от KRoN73

Пример некорректен. Там одно действие и хоть так, хоть сяк запиши. В nextimg = count++ их два.

Deleted
()
Ответ на: комментарий от erfea

ващета у пост как и у пре операций приоритет один из наиболее высоких среди унарных( да и вообще очерёдность унарных вызвана что они могут буть с двух сторон относительно обьекта записаны)

ты тут приоритет не кместу

у постинкремента эфект что возвращаемое значение отличается(чаще всего) от состояния обьекта по завершения всего выражения

а в каком порядке выполняется сама постинкрементация вообще точно не определено.

qulinxao ★★☆
()
Ответ на: комментарий от KRoN73

Для человека, не видящего семантического мусора — ничем.

Готов не согласиться!

«Мне кажется что знаки препинания не нужны там где и так всё понятно».

obinos
()
Ответ на: комментарий от erfea

Приоритет оператора абсолютно не в этом состоит \^////~. Он состоит в том, как будут «расставлены скобки» при преобразовании выражения в AST.

dmfd
()
Ответ на: комментарий от Deleted

вопрос скорее в общем падении того уровня который считают мастерством.

живи быстро и избегай нюансов и на выходе получаем JAVA c её разумной бюрократией.

qulinxao ★★☆
()
Ответ на: комментарий от obinos

Аналогия некорректна, так как в данном случае «знаки препинания» избыточны. Они не требуются ни по грамматике языка, ни по его семантике.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.