Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Разница между выражениями и инструкциями (https://javascript.ru/forum/misc/25447-raznica-mezhdu-vyrazheniyami-i-instrukciyami.html)

Вовочка 05.02.2012 22:02

Разница между выражениями и инструкциями
 
Читаю David Flanagan.
Перечитывал 2-3 раза разделы Выражения и Инструкции, но так и не дошло в чём собственно принципиальная разница.

Итак, простейшие выражения:
1.7
"Javascript is fun"
true
{x:2, y:2}
[2,3,5,7]
function(x){return x*x}


Далее сказано, что если смешать выражения и операторы, то получаются выражения.

Это выражения:
w = x + y + z;
q=a?b:c?d:e?f:g;


И всё бы ничего, но дальше следует глава инструкции.

1. Инструкция-выражение
i *=3;

Ну эта конструкция я так понимаю одновременно и инструкция и выражение. Правильно понимаю? Соответственно примеры выше также являются выражениями?

2. Составные-инструкции
Следующие строки рассматриваются как одна инструкция.
{
     x=Math.PI;
     cx=Math.cos(x);
     alert("cos(" + x + ") = " + cx);
}

Вопрос: может ли код выше рассматриваться как одно выражение?

3. Инструкции if, switch ... я так понимаю это уже чистой воды инструкции и никак не выражения. Они работают с выражениями. Правильно понимаю?

В общем и целом хочу уловить грань между двумя понятиями. Где заканчивается одно и начинается другое?
Любое выражение есть инструкция?
Благодарю за внимание

Вовочка 05.02.2012 23:26

Цитата:

Сообщение от Maxmaxmaximus (Сообщение 155618)
и совет мой тебе поменьше подобной ахинеи писать чтобы мозги не запудривать бредом)

когда-то давно я участвовал в одном то ли конкурсе, то ли конференции. После того, как человек делал доклад. Другие участники задавали вопросы. Так вот, крайне глупо выглядело когда человек говорил термин, а потом не смог объяснить что они обозначают.

С тех пор, я привык вдумываться в то, что говорю.

Наглядный пример
http://www.youtube.com/watch?v=e1ygOEs3Wfc

poorking 06.02.2012 00:25

Цитата:

Сообщение от Maxmaxmaximus
не инструкции, в конструкции.

Не врите

poorking 06.02.2012 00:28

Цитата:

Сообщение от Вовочка
i *=3;

Это инструкция из одного выражения. В инструкциях может участвовать более одного выражения, для этого их надо {}. Выражения что-то возвращают, инструкции просто объединяют выражения в один логический блок

T-sh 06.02.2012 04:03

имхо, правильнее будет как-то так:

1. Любое выражение — это инструкция.
2. Не каждая инструкция — выражение.

Выражение — инструкция, присваивающая правую часть выражения левой части (выражает левую через правую).

a = 10; — выражение.
var a = 10; — инструкция и выражение (сначала [var a] — инструкция, которая не является выражением т.к. присваивания нет, а потом уже [a = 10] — выражение, которое можно также назвать инструкцией).

if (a){} else{} и т.д. — инструкция, но не выражение, ибо ничего не выражается, но действия происходят.

Точно также и с w = x+y+z :
1. x+y+z — инструкция, но не выражение.
2. w = то, что вернула инструкция (x+y+z) — выражение и инструкция присваивания одновременно :)

Как-то так) с составными также.

T-sh 06.02.2012 04:44

Цитата:

Сообщение от Maxmaxmaximus (Сообщение 155662)
T-sh,
что такое:
(a = 13+2)
?

(a = 13+2) — это инструкция и выражение.

инструкция: 13+2 (сложить 13 и 2)
выражение: a = 15. (выразить "а" числом 15)

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

инструкция = действие (сделай то и то)
выражение = обзывание (это будет этим) и в свою очередь процесс обзывания = инструкция (назови это этим)

T-sh 06.02.2012 05:18

Цитата:

Сообщение от Maxmaxmaximus (Сообщение 155664)
а теперь прочитай мое отредактированное сообщение и забудь тот бред который знал до этого)
ты написал несусветную самописную бредятину основанную на домыслах)

да ну? :)

Цитата:

выражение это то место где происходят динамические действия, а инструкция это любой оператор!!
инструкция — да, это любой оператор и любая конструкция..
а вот как в выражении может быть динамики??

2+2 — это выражение??? если да, то что выражается и чем??

a = 2+2 <=> a = 4 — вот это выражение. а динамики тут не может быть никакой, ибо по всем правилам и математики, и логики, и программирования сначала вычисляется правая часть (инструкция, где вместо 2+2 может быть сотня функций, две сотни условий и миллион действий), а потом уже статикой готовое значение присваивается левой части <=> левая часть выражается значением правой.

2+2 — это действие, т.е. инструкция к действию.
a = 2+2 — это выражение переменной "а" через инструкцию 2+2, т.е. выражение переменной "а" результатом исполнения инструкции (статическим, ибо на лету оно измениться при присваивании не может, для этого понадобится произвести все действия заново) — значением 4.

никакой динамике в присваивании (выражении) быть не может, ибо 2+2 всегда будет равно 4, и никогда не будет равно "вася".

T-sh 06.02.2012 05:27

Цитата:

Сообщение от Maxmaxmaximus (Сообщение 155668)
T-sh, ссылку на определение "выражение javascript"


нет такой ссылки, ибо каждый трактует по своему.

в свою очередь, ответ на вопрос:
что выражает и чем: 2+2?

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

а то будет как с нулём.. пол дня утверждать, что ноль — не число, а только потом понять, что нулем по умолчанию считается +0.

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

poorking 06.02.2012 07:24

Цитата:

Сообщение от Maxmaxmaximus
не в фигурные, а в круглые вообще-то

не врите снова. У вас получилось выражение, как вы и заметили сами. А я говорил про инструкцию. Например синтаксис цикла while:

while (condition) инструкция


например
var l, attempts;

attempts = 0; while ( l = getLivaanderiamarum() ) {
     try {
         JusticeEngine.execCommand(l, "kill");
     } catch (fail) {
         JusticeEngine.pushPatience(100500);
     }

     attempts ++;
}


PS: А термины не я придумал

B@rmaley.e><e 06.02.2012 09:22

Не надо читать посты пользователя Maxmaxmaximus. Он уже давно всем показал, что не знает JS.

В стандарте говорится, что инструкцией может быть Выражение или Блок, объединяющий несколько инструкций.
Отсюда следует, что выражение является инструкций, а вот то, что блок будет являться выражением, конечно же, не следует. Если посмотреть определение Выражения, то можно заметить, что инструкцией оно не является.

Оно и понятно: выражение всегда можно посчитать и получить его значение. Если бы блок инструкций также был выражением, то не очень понятно, о каком значении шла бы речь.


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