Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Инкремент и декремент (https://javascript.ru/forum/misc/51877-inkrement-i-dekrement.html)

soltx 23.11.2014 15:35

Инкремент и декремент
 
Привет! Накидайте задачек для закрепления материала http://learn.javascript.ru/task/inkr...ent-1708223838

bes 23.11.2014 18:52

объясни почему этот код не работает
var a = 1++;
alert(a);

BaBaKa 23.11.2014 20:15

потому что все нормальные люди напишут:
var a =2;
alert(a);

или
alert(2);

danik.js 23.11.2014 20:29

BaBaKa, по-твоему некий код может не работать только потому, что кто-то пишет какой-то другой код? :D

soltx 23.11.2014 21:03

Цитата:

Сообщение от bes (Сообщение 342516)
объясни почему этот код не работает
var a = 1++;
alert(a);

Инкремент/декремент можно применить только к переменной.

krutoy 23.11.2014 21:21

bes,
Потому что число является иммутабельным объектом? Соответственно, такой синтаксис является недопустимым. Только я не понимаю, нахрена, чтобы продемонстрировать это, нужно присваивание? При какой п*де тут оно?
++1

krutoy 23.11.2014 21:30

Цитата:

Сообщение от bes
var a = 1++;
alert(a);

И у тебя там ничего не записывается в переменную, твой алерт вообще не выполняется. Ошибка вываливается при инкременте, до присваивания даже не доходит, не то что до алерта
var a = 1++;
alert("something else");

soltx 23.11.2014 21:55

bes скинул задачку, как пример "объясни почему этот код не работает" некоторых понесло не туда и не в тему, ладно тему можно закрыть сам напридумывал.

krutoy 23.11.2014 22:14

Цитата:

Сообщение от soltx
объясни почему этот код не работает

Ага, объясни, почему этот код не работает:
throw "ERROR"
var rows=document.getElementsByTagName("tr");var j=0;var row=false;var item=false;var imglist=false;var attr="";var change=false;var found=false;var tcat=false;for(var i=0;i<rows.length;i++)
{row=rows[i];if(!row.className||row.className=='')
{change=false;tcat=false;for(j=0;j<row.childNodes.length;j++)
{item=row.childNodes[j];if(item.className&&item.className=='thead')
{change=true;}
if(item.className&&item.className=='tcat')
{if(tcat)
{item.className='tcat tcat2';}
tcat=true;}}
if(change)
{row.className='thead-row';imglist=row.getElementsByTagName("img");for(j=0;j<imglist.length;j++)
{attr=imglist.item(j).src;if(attr.indexOf('menu_open.gif')>0)
{attr=attr.replace(/menu_open.gif/,'menu_open2.gif');imglist.item(j).src=attr;}}}}
if(row.className&&row.className=='vbmenu_dark')
{imglist=row.getElementsByTagName("img");for(j=0;j<imglist.length;j++)
{attr=imglist.item(j).src;if(attr.indexOf('menu_open.gif')>0)
{attr=attr.replace(/menu_open.gif/,'menu_open2.gif');imglist.item(j).src=attr;}}}}
item=document.getElementById('posts');if(item)
{rows=item.getElementsByTagName('table');if(rows&&rows.length>1&&rows[1].className&&rows[1].className==='tborder')
{rows[1].style.borderTopWidth='0';}}
item=document.getElementById('post');if(item&&item.className&&item.className==='tborder')
{item.style.borderTopWidth='0';}
ca_parse_bbcode_block(document);function ca_parse_bbcode_block(parent)
{rows=parent.getElementsByTagName("table");for(i=0;i<rows.length;i++)
{ca_parse_bbcode_table(rows[i]);}}
function ca_parse_bbcode_table(row)
{return
if(row.className&&row.className=='bbcode-rounded bbcode-rounded-code')
{item=row.parentNode;if(item.offsetWidth==row.offsetWidth&&item.offsetWidth>0)
{change=row.offsetWidth- 40;if(item.className&&item.className=='bbcode-rounded-content')
{change=change- 10;}
row.style.width=change+'px';imglist=row.getElementsByTagName('pre');if(imglist.length)
{imglist[0].style.width=(change- 8)+'px';}}
else
{change=item.offsetWidth- 40- row.offsetWidth;if(change>10)
{if(item.className&&item.className=='bbcode-rounded-content')
{change=change- 10;}
row.style.width=(row.offsetWidth+ change)+'px';imglist=row.getElementsByTagName('pre');if(imglist.length)
{imglist[0].style.width=(imglist[0].offsetWidth+ change- 8)+'px';}}}}
if(row.className&&row.className=='bbcode-rounded bbcode-rounded-quote')
{item=row.parentNode;if(item.offsetWidth==row.offsetWidth&&item.offsetWidth>0)
{change=row.offsetWidth- 40;if(item.className&&item.className=='bbcode-rounded-content')
{change=change- 10;}
row.style.width=change+'px';}
else
{change=item.offsetWidth- 40- row.offsetWidth;if(change>10)
{if(item.className&&item.className=='bbcode-rounded-content')
{change=change- 10;}
row.style.width=(row.offsetWidth+ change)+'px';}}}}
var ca_bbcode_parsed=true;

bes 23.11.2014 22:16

Цитата:

Сообщение от soltx
bes скинул задачку, как пример "объясни почему этот код не работает" некоторых понесло не туда и не в тему, ладно тему можно закрыть сам напридумывал.

здесь принят хороший стиль - темы закрываются только в исключительных случаях ;)
или что, попросил заданий, а, не решив и первого, сразу в кусты?


Цитата:

Сообщение от soltx
Инкремент/декремент можно применить только к переменной.

для понимания того как работают конструкции javascript этого слишком мало

подсказываю
http://es5.javascript.ru/x11.html#x11.3
Цитата:

PostfixExpression :
LeftHandSideExpression
LeftHandSideExpression [no LineTerminator here] ++
LeftHandSideExpression [no LineTerminator here] --
http://es5.javascript.ru/x11.html#x11.3.1
Цитата:

Для вычисления PostfixExpression : LeftHandSideExpression [no LineTerminator here] ++ выполняются следующие шаги:
http://es5.javascript.ru/x11.html#x11.2
Цитата:

LeftHandSideExpression :
NewExpression
CallExpression

NewExpression :
MemberExpression
new NewExpression

MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
http://es5.javascript.ru/x11.html#x11.1
Цитата:

PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
http://es5.javascript.ru/x7.html#x7.8
Цитата:

Literal ::
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
RegularExpressionLiteral
то есть, исходя из первой строчки алгоритма, там могут быть числовые литералы
вывод - ищи ответ в последующих строчках

bes 23.11.2014 22:20

Цитата:

Сообщение от krutoy
При какой п*де тут оно?

чтобы вывело окно alert c ошибкой (здесь на сайте это работает) ;)

krutoy 23.11.2014 22:22

bes,
Не "оно" выводит тебе алерт. Еще раз
1++

bes 23.11.2014 22:23

Цитата:

Сообщение от krutoy
bes,
Не "оно" выводит тебе алерт. Еще раз

уговорил :)

soltx 23.11.2014 23:58

Продолжаем разговор :) Дело в том что я изучаю основы и хотел от Вас получить задачи не такого уровня, а на подобии http://learn.javascript.ru/task/inkr...rement-primery пока считаю не время углубляться, а держаться курса и проходить все постепенно.

jsnb 24.11.2014 07:45

soltx, вот тебе генератор таких задач: http://learn.javascript.ru/play/6MPGrc

kostyanet 24.11.2014 08:15

Академики охренели. На практике задача проявляется в таком вот контексте
function some_func(){
 var i=5;
// some logics
  return i++;
}


Кодер недоумевает почему вернулось 5.

kostyanet 24.11.2014 08:18

Цитата:

Сообщение от soltx
а на подобии

Сначала русский: наподобие.

soltx 24.11.2014 12:52

Цитата:

Сообщение от kostyanet (Сообщение 342568)
Сначала русский: наподобие.

ЖЫ ШЫ, я смотрю ты тот еще ниндзя

soltx 24.11.2014 12:57

Цитата:

Сообщение от jsnb (Сообщение 342563)
soltx, вот тебе генератор таких задач: http://learn.javascript.ru/play/6MPGrc

:) спасибо

bes 24.11.2014 21:48

Цитата:

Сообщение от soltx
Продолжаем разговор Дело в том что я изучаю основы и хотел от Вас получить задачи не такого уровня, а на подобии

странная логика, это и есть основы

вот весь алгоритм
http://es5.javascript.ru/x11.html#x11.3.1
Цитата:

11.3.1 Постфиксный оператор инкремента # Ⓣ Ⓡ Ⓖ
Для вычисления PostfixExpression : LeftHandSideExpression [no LineTerminator here] ++ выполняются следующие шаги:

Пусть lhs будет результатом вычисления LeftHandSideExpression Левостороннее выражение.
Сгенерировать исключение SyntaxError, если все следующие условия являются истинными:
Type(lhs) равно Reference равно true
IsStrictReference(lhs) равно true
Type(GetBase(lhs)) равно Environment Record
GetReferencedName(lhs) равно либо "eval", либо "arguments"
Пусть oldValue Старое значение будет ToNumber(GetValue(lhs)).
Пусть newValue Новое значение будет результатом прибавления значения 1 к значению oldValue, с применением таких же правил, что и для оператора + (см. пункт. 11.6.3).
Вызвать PutValue(lhs, newValue).
Вернуть oldValue.
первую строчку мы прошли, осталось ещё несколько, ты - пас, ждём пока ответ на этот вопрос даст krutoy :)

krutoy 24.11.2014 21:58

bes,
Какой вопрос, я не люблю портянки читать. Сформулируй внятно и кратко.

bes 24.11.2014 22:22

Цитата:

Сообщение от krutoy
bes,
Какой вопрос, я не люблю портянки читать. Сформулируй внятно и кратко.

объясни почему этот код не работает, ориентируясь на алгоритм, описанный в спецификации
1++;

krutoy 24.11.2014 22:59

bes,
Нахрен мне сраная спецификация? Надо быть дебилом, чтобы не понимать, почему это не работает. Почему тогда это не работает
+++

А чо, пусть арифметическая операция инкрементируется, чем она хуже? Тебе, наверное, лекарство пора принять.

bes 24.11.2014 23:29

Цитата:

Сообщение от krutoy
bes,
Нахрен мне сраная спецификация? Надо быть дебилом, чтобы не понимать, почему это не работает.

ну да, дебилы, когда видят, что это не работает, не понимают, что это не работает,
иногда, правда, объяснить могут - не работает :D

Цитата:

Сообщение от krutoy
Почему тогда это не работает
+++

здесь возможно немного проще
http://es5.javascript.ru/x7.html#x7
Цитата:

Исходный текст программы на ECMAScript предварительно преобразуется в последовательность входных элементов, которые представляют собой токены, символы окончания строки, комментарии или пробельные символы. Исходный текст анализируется слева направо, каждый раз принимая максимально возможную последовательность символов за следующий входной элемент.
то есть +++ будет расценено как ++ (префиксный оператор инкремента) и символ +
http://es5.javascript.ru/x11.html#x11.4.4
Цитата:

Для выполнения UnaryExpression : ++ UnaryExpression выполняются следующие шаги:
http://es5.javascript.ru/x11.html#x11.4
Цитата:

UnaryExpression :
PostfixExpression
delete UnaryExpression
void UnaryExpression
typeof UnaryExpression
++ UnaryExpression
-- UnaryExpression
+ UnaryExpression
- UnaryExpression
~ UnaryExpression
! UnaryExpression
и далее куда ни пойди, + не является допустимым входным элементом, к которому будет применяться данная синтаксическая грамматика, поэтому транслятор сообщает о появлении синтаксической ошибки

рони 24.11.2014 23:30

:-? подожду может кто-то обьяснит почему это не работает. :(

bes 24.11.2014 23:32

Цитата:

Сообщение от krutoy
А чо, пусть арифметическая операция инкрементируется, чем она хуже? Тебе, наверное, лекарство пора принять.

а чо бы и нет, пусть инкрементируется: a ++ b - два раза сложить а и b :D

krutoy 25.11.2014 00:15

Цитата:

Сообщение от bes
а чо бы и нет, пусть инкрементируется: a ++ b - два раза сложить

Нет, ты не понял. инкремент -- это деструктивная операция, она меняет свой операнд. твой вшивый пример не в кассу. Это означало бы, что оператор плюс отныне будет означать двойное сложение, если уж развивать этот бред.

kostyanet 25.11.2014 08:23

Токены-хуекины тут не стояли. Скалярное значение это не переменная. Запись 1++ означает абсурд, нонсенс, nonsense, бред укуренного стрептококка. Дизайн-тайм наезжает на рантайм и что вы лично bes предложили бы писателям интерпретатора чтобы развести этих братков?

Интерпретатор НЕ может менять исходный текст программы как ему там захочется. Если написано 1 - значит там написано 1, а ++ - идут в жопу, ибо это попытка принудить интерпретатор изменить исходник.

Конкретная реализация реакции интерпретатора на свое "нипонял" - вообще не колебет.

bes 25.11.2014 18:38

Цитата:

Сообщение от krutoy
Нет, ты не понял. инкремент -- это деструктивная операция, она меняет свой операнд. твой вшивый пример не в кассу. Это означало бы, что оператор плюс отныне будет означать двойное сложение, если уж развивать этот бред.

нет, ты снова не вкурил (инкремент --, который декремент, опустим):
можно писать всё, что угодно, лишь бы транслятор мог это выполнить, а ты понимал, к чему это приведёт,
как это всё будет интерпретироваться описано в спецификации, чтобы и другие это поняли также как и ты

хорошо, интуитивно вроде бы всем понятно, что 1++ работать не должно
кому не понятно, смотрит в консоль и убеждается - действительно, не работает :cray:

http://es5.javascript.ru/x11.html#x11.3.1
пункт 1 - описательный
числовой литерал в исходном тексте программы представляет собой неизменное значение и не создаёт ссылку (не типа Reference), поэтому пункт 2 проходим без проблем (было рассуждал на тему http://javascript.ru/forum/offtopic/...-perevoda.html)
3, 4 - норма
затык на пункте 5
Цитата:

Вызвать PutValue(lhs, newValue).
http://es5.javascript.ru/x8.html#x8.7.2
Цитата:

1. Если Тип(V) не является Reference, сгенерировать исключение ReferenceError.
физический смысл простой: ++ в стакан может долить, а с закуски оно стекает :D

bes 25.11.2014 18:39

Вопрос 2: откуда NaN?
var a = function () {};
a++;
alert(a);

bes 25.11.2014 23:10

Цитата:

Сообщение от bes
откуда NaN?

предполагаю, что ждать бессмысленно :)

http://es5.javascript.ru/x11.html#x11.3.1
Цитата:

3. Пусть oldValue ("Старое значение") будет ToNumber(GetValue(lhs)).
http://es5.javascript.ru/x9.html#x9.3
Цитата:

Object
Выполняются следующие шаги:
Пусть primValue Примитивное значение будет равно ToPrimitive(входной аргумент, подсказка Number).
Вернуть ToNumber(primValue).
http://es5.javascript.ru/x9.html#x9.1
Цитата:

Object
Возвращает значение по умолчанию для Object. Значение по умолчанию какого-либо объекта получается путем вызова внутреннего метода [[DefaultValue]] этого объекта, с передачей необязательной подсказки PreferredType. Описание поведения внутреннего метода [[DefaultValue]] для всех родных объектов ECMAScript приводится в данной спецификации в пункте 8.12.8.


http://es5.javascript.ru/x8.html#x8.12.8
Цитата:

При вызове внутреннего метода [[DefaultValue]] объекта O с подсказкой Number выполняются следующие шаги:
далее долго рассуждаем и приходим к выводу

bes 25.11.2014 23:11

Вопрос 3: null :D

рони 26.11.2014 10:48

bes,
Спасибо конечно за науку, но сия премудрость мне не подвласна, не осилил, я уж по привычке: не работает и нафиг, а уж почему не работает, мне то неведомо ...эхх :(

bes 26.11.2014 21:05

Цитата:

Сообщение от рони
bes,
Спасибо конечно за науку, но сия премудрость мне не подвласна, не осилил, я уж по привычке: не работает и нафиг, а уж почему не работает, мне то неведомо ...эхх

я тоже не всё освоил, но прикладываюсь потихоньку, поэтому возможно не всё, что я здесь изложил при объяснении, было понято мной правильно (но никто не поправил)
как полностью осилю - скажу "ничего там сложного нет" :D
как бы то ни было, логично для объяснения того, как работают конструкции javascript, использовать именно эти основные правила движения по дорогам исходного кода, а ничто другое
и я в подобных темах ещё пару лет назад хотел бы видеть лучше кучу вырезок из спецификации с пояснениями, чем что-либо другое
возможно странно, что здесь такое мало практикуется :-?

рони 26.11.2014 21:17

:write: может кроме доступного изложения в учебнике добавлять сполер с докой из ECMAScript ... мысли вслух

bes 26.11.2014 21:26

Цитата:

Сообщение от рони
может кроме доступного изложения в учебнике добавлять сполер с докой из ECMAScript ... мысли вслух

Илья знает спецификацию, иногда явно указывает, что где, как, например, здесь
http://learn.javascript.ru/prototype
Цитата:

Ссылка __proto__ в спецификации
Если вы будете читать спецификацию EcmaScript — свойство __proto__ обозначено в ней как [[Prototype]].

Двойные квадратные скобки здесь важны, чтобы не перепутать его с совсем другим свойством, которое называется prototype, и которое мы рассмотрим позже.
может в будущем учебник выйдет на новый уровень :)


Часовой пояс GMT +3, время: 23:13.