выражение присваивания, что возвращает
От: abc1234573  
Дата: 17.08.11 11:45
Оценка: :)
что возвращает выражение типа. когда одно значение присваивается другому

int a, b = 1;

[b]if (a = b) // именно здесь что возвращает выражение?[b]
{
// print result
}
Re: выражение присваивания, что возвращает
От: abdab Россия  
Дата: 17.08.11 11:59
Оценка: +1
Здравствуйте, abc1234573, Вы писали:

A>что возвращает выражение типа. когда одно значение присваивается другому


A>int a, b = 1;


A>if (a = b) // именно здесь что возвращает выражение?

A>{
A> // print result
A>}

Возварщает значение а.
Все это хорошо видно в дизассемблере, например, в студии:

  if( a = b )
009D14D5  mov         eax,dword ptr [b] 
009D14D8  mov         dword ptr [a],eax 
009D14DB  cmp         dword ptr [a],0 
009D14DF  je          main+48h (9D14F8h)


То есть выражение

if (a = b)
[ccode]
эквивалентно коду

a = b;
if (a)
[/ccode]
Re[2]: выражение присваивания, что возвращает
От: Centaur Россия  
Дата: 17.08.11 15:21
Оценка: 9 (1)
Здравствуйте, abdab, Вы писали:

A>>что возвращает выражение типа. когда одно значение присваивается другому


A>>if (a = b)


A>Возварщает значение а.

A>Все это хорошо видно в дизассемблере, например, в студии:

Ссылаться надо не на дизассемблер, а на стандарт языка.
Re[3]: выражение присваивания, что возвращает
От: abdab Россия  
Дата: 17.08.11 16:04
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, abdab, Вы писали:


A>>>что возвращает выражение типа. когда одно значение присваивается другому


A>>>if (a = b)


A>>Возварщает значение а.

A>>Все это хорошо видно в дизассемблере, например, в студии:

C>Ссылаться надо не на дизассемблер, а на стандарт языка.


Правда ваша, но все же мне кажется, что в таких простейших вопросах можно и самому на практике попытаться их разрешить, при этом будешь знать не только ответ на свой вопрос, но и увидишь во что реально компилятор превращает этот код.
Re[3]: выражение присваивания, что возвращает
От: 11molniev  
Дата: 17.08.11 19:19
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, abdab, Вы писали:


A>>>что возвращает выражение типа. когда одно значение присваивается другому


A>>>if (a = b)


A>>Возварщает значение а.

A>>Все это хорошо видно в дизассемблере, например, в студии:

C>Ссылаться надо не на дизассемблер, а на стандарт языка.


Лень искать копию стандарта, так что на память:

1. Конструкция if определена как if (выражение)
2. Выражение истино, если отлично от нуля. Если выражение равно нулю оно ложно.
3. a = b, a = b = c = d, a < b == c < d, function(a, b) и все остальное, что возвращает значение (и на первый взгляд не возвращает — тоже) — являеться выражением. (В стандарте правдо от противного, сказано что выражения и как могут образовываться. Но там это кусок здоровый)
3.1 Выражение может быть простым — константа, строка, функция
3.2 Выражение может быть составным — последовательность операций над выражениями
3.3 Любое выражение имеет значение — простое понятно что за значение, составное выражение — это результат последний по приоритету операции
4. Выражение от a = b: составное выражение языка. Результат выражения (3.3) результат последней по приоритету операции (здесь она одна "="). Результат операции "=" — все что справо.
Т.е. у выражения a = b — есть 2 результата: изменение a и все что справа от "=".
При { a = b; } второй результат не используеться (его нет), при { if ( a = b ) ; } — второй результат (значение а в данном контексте) и проверяеться на равенство нулю.

Мораль сей сказки такова:
1. В си можно пихать вычисления куда захочеться, ну типа: if ( a = b — 8, b = a + 185, c = a * b) — откампилить и будет славно работать.
2. Так лучше не делать. Ну или знать рамки разумного.
3. Стоит прочесть книгу Кернитигана и Ричи, что бы непонятные конструкции стали чертовски удобной фичей. Которой все равно см. пункт 2.
4. результат выражения — lvalue — это то что слева, в соответствии с приоритетом операций (как самые простые примеры):
4.1 if (a) — выражение от а — это само а. Если а не равно нулю — значит истина, иначе ложь.
4.2 if (a = b) — выражение преравнивания — результат выражение все что справо (значение b), этому приравниваеться все что слева (переменная а) и это (значение b) используеться как критерий истиности — равно ли нулю.
4.3 if (a = b == b) — составное выражение. Вычсляеться в соответствии с приоритетом операций — сначала приравнивание (a = b == b) --> ( (a = b) == b) --> ( a == b ). Вычисляеться операция сравнения a (ужо приравненого значению b) и b. Если они равны — то 1 (выражение истино) иначе ноль

и так далее, и в том же духе...
Re[4]: выражение присваивания, что возвращает
От: really  
Дата: 29.08.11 03:11
Оценка: +1
Здравствуйте, 11molniev, Вы писали:

1>4.3 if (a = b == b) — составное выражение. Вычсляеться в соответствии с приоритетом операций — сначала приравнивание (a = b == b) --> ( (a = b) == b) --> ( a == b ). Вычисляеться операция сравнения a (ужо приравненого значению b) и b. Если они равны — то 1 (выражение истино) иначе ноль


сначала проверка равенства, потом присваивание:
a = b == c <=> a = (b == c)
Re[4]: выражение присваивания, что возвращает
От: Alexander Poluektov Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 29.08.11 07:38
Оценка: +1
Здравствуйте, abdab, Вы писали:

C>>Ссылаться надо не на дизассемблер, а на стандарт языка.


A>Правда ваша, но все же мне кажется, что в таких простейших вопросах можно и самому на практике попытаться их разрешить, при этом будешь знать не только ответ на свой вопрос, но и увидишь во что реально компилятор превращает этот код.


Дизассемблер может быть полезен в исследовании того, насколько данный компилятор соответствует стандарту.
Строить же индукцию о языковых правилах на основании конкретного дизассемблера -- опасное и бесполезное занятие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.