Господа, прочитав пост
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;
}
Я в растерянности. Многоуважаемые гуру, просветите, где лопата зарыта ?
Здравствуйте, dik o-braz, Вы писали:
(int *)p1 = p2;
результат каста — r-value;
*(int *)p1 = *p2;
результат каста — rvalue; Применяя к полученному r-value operator *() получаем l-value. А этому l-value можно присвоить новое значение.