Вопрос по while ();
От: Аноним  
Дата: 28.08.10 15:17
Оценка:
Такая фишка:

WCHAR *pw1, *pw2;

pw1 = new WCHAR [10];
pw2 = new WCHAR [10];

ZeroMemory (pw1, 20);
ZeroMemory (pw2, 20);

pw1[0]=0x20;
pw1[1]=0x20;
pw1[2]=0x55;

pw2[0]=0;
pw2[1]=0;

while (*pw1++ = pw2++);

После выполнения pw1 и pw2 увеличиваются на sizeof (WCHAR)

Почему так?
По идее, сначала в цикле вынимается содержимое *pw2, но оно уже равно нулю, делее продолжения быть не должно,
но все-таки строки копируются с завершающим нулем из *pw2

??

Или так:
while (*pw2++);
pw2 увеличивается на sizeof (WCHAR); хотя там нуль сразу в первой ячейке.
Re: Вопрос по while ();
От: Pzz Россия https://github.com/alexpevzner
Дата: 28.08.10 15:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>while (*pw1++ = pw2++);


Вы звездочку перед pw2 не забыли?

А>По идее, сначала в цикле вынимается содержимое *pw2, но оно уже равно нулю, делее продолжения быть не должно,

А>но все-таки строки копируются с завершающим нулем из *pw2

Потому что сначала вычисляется выражение *pw1++ = *pw2++, значением которого является то, что лежало по адресу *pw2, а побочными эффектами — увеличение указателей и копирование WCHAR'а из *pw2 в *pw1. Если там лежал ноль, то продолжения не будет, но ноль таки скопируется.

Я, кстати, циклы с пустым телом предпочитаю писать так:

while( *pw1++ = *pw2++ )
    ;


Сразу видно, что это цилк с пустым телом, а не странная описка.
Re[2]: Вопрос по while ();
От: roman313  
Дата: 28.08.10 15:48
Оценка:
Да нет, просто в форуме забыл поставить. цикл такой:
while (*pw1++ = *pw2++);

Но все-таки хотелось бы понять логику работы выражения.

Кто может объяснить логику ?
Re: Вопрос по while ();
От: любой  
Дата: 28.08.10 15:54
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>По идее, сначала в цикле вынимается содержимое *pw2, но оно уже равно нулю, делее продолжения быть не должно,


Оператор "++" имеет больший приоритет, чем "*". Он выполняется первым (возвращает текущее значение указателя и увеличивает его). А уж потом "*" выполняется по отношению к результату предыдущей операции.
художников никогда не обижал
Re[3]: Вопрос по while ();
От: Pzz Россия https://github.com/alexpevzner
Дата: 28.08.10 15:56
Оценка:
Здравствуйте, roman313, Вы писали:

R>Кто может объяснить логику ?


Ну я же объяснил. С какого места непонятно?
Re[2]: Вопрос по while ();
От: Pzz Россия https://github.com/alexpevzner
Дата: 28.08.10 15:58
Оценка: :))
Здравствуйте, любой, Вы писали:

Л>Оператор "++" имеет больший приоритет, чем "*". Он выполняется первым (возвращает текущее значение указателя и увеличивает его). А уж потом "*" выполняется по отношению к результату предыдущей операции.


Вот уж приоритет здесь абсолютно не при чем. Выражение, стоящее в условии while вычисляется целиком, со всеми побочными эффектами. И лишь потом while смотрит на значение чтобы решить, ехать дальше или остановиться.

P.S. Чему вас только учат?...
Re[3]: Вопрос по while ();
От: roman313  
Дата: 28.08.10 16:03
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, любой, Вы писали:


Л>>Оператор "++" имеет больший приоритет, чем "*". Он выполняется первым (возвращает текущее значение указателя и увеличивает его). А уж потом "*" выполняется по отношению к результату предыдущей операции.


Pzz>Вот уж приоритет здесь абсолютно не при чем. Выражение, стоящее в условии while вычисляется целиком, со всеми побочными эффектами. И лишь потом while смотрит на значение чтобы решить, ехать дальше или остановиться.


Pzz>P.S. Чему вас только учат?...



— в общем-то да,
сначала (по VC++ asm-коду вынимается *pw2, затем идет запись в *pw1,
затем pw2 и pw1 увеличиваются, а лишь потом идет проверка на нуль...
Re[4]: Вопрос по while ();
От: любой  
Дата: 28.08.10 16:10
Оценка: +1
Здравствуйте, roman313, Вы писали:

R>- в общем-то да,

R>сначала (по VC++ asm-коду вынимается *pw2, затем идет запись в *pw1,
R>затем pw2 и pw1 увеличиваются, а лишь потом идет проверка на нуль...

Asm-код не отражает логику языка.
художников никогда не обижал
Re[5]: Вопрос по while ();
От: любой  
Дата: 28.08.10 16:35
Оценка:
Кстати, это выражение можно переписать, как *(pw1++) = *(pw2++). А вот как (*pw1)++ = (*pw2)++ не получится.
художников никогда не обижал
Re[5]: Вопрос по while ();
От: vi.k  
Дата: 31.08.10 04:35
Оценка:
Здравствуйте, любой, Вы писали:

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


R>>- в общем-то да,

R>>сначала (по VC++ asm-коду вынимается *pw2, затем идет запись в *pw1,
R>>затем pw2 и pw1 увеличиваются, а лишь потом идет проверка на нуль...

Л>Asm-код не отражает логику языка.


В данном случае отразил правильно — всё выполнилось как и положено
Re[3]: Вопрос по while ();
От: March_rabbit  
Дата: 31.08.10 07:43
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>P.S. Чему вас только учат?...

не лазить в темные углы языка (с) Страуструп
тогда не придется угадывать, что в каком порядке выполняется
Re[4]: Вопрос по while ();
От: Pzz Россия https://github.com/alexpevzner
Дата: 31.08.10 09:43
Оценка:
Здравствуйте, March_rabbit, Вы писали:

Pzz>>P.S. Чему вас только учат?...

M_>не лазить в темные углы языка (с) Страуструп
M_>тогда не придется угадывать, что в каком порядке выполняется

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