l-value type cast
От: dik o-braz  
Дата: 11.02.04 16:14
Оценка:
Господа, прочитав пост inline memset
Автор: MShura
Дата: 10.02.04
, обнаружил у себя белое пятно в знаниях с и с++.

По поводу сабжа нарыл в мсдн следующее:

Microsoft C includes an extension to the ANSI C standard that allows casts of l-values to be used as l-values, as long as the size of the object is not lengthened through the cast


И эксперимент №1 будто бы это подтверждает.
Итак, отключаем расширения (чтобы не воздействовали) и осуществляем
эксперимент №1: компилируем следующий код vc++ 6.0 и bc++ 5.5.1
void f( short *p1, int *p2 )
{
  (int *)p1 = p2;
}


в результате ошибка компиляции в обоих случаях
vc++: error C2106: '=' : left operand must be l-value
bc++: E2277: Lvalue required in function f


Но те же самые компиляторы, запущенные с теми же опциями,
клювом не щелкнув, съедают код эксперимента №2:
void f( short *p1, int *p2 )
{
  *(int *)p1 = *p2;
}


Я в растерянности. Многоуважаемые гуру, просветите, где лопата зарыта ?
Re: l-value type cast
От: Bell Россия  
Дата: 11.02.04 16:29
Оценка:
Здравствуйте, dik o-braz, Вы писали:


(int *)p1 = p2;

результат каста — r-value;


*(int *)p1 = *p2;

результат каста — rvalue; Применяя к полученному r-value operator *() получаем l-value. А этому l-value можно присвоить новое значение.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.