После выполнения pw1 и pw2 увеличиваются на sizeof (WCHAR)
Почему так?
По идее, сначала в цикле вынимается содержимое *pw2, но оно уже равно нулю, делее продолжения быть не должно,
но все-таки строки копируются с завершающим нулем из *pw2
??
Или так:
while (*pw2++);
pw2 увеличивается на sizeof (WCHAR); хотя там нуль сразу в первой ячейке.
Здравствуйте, Аноним, Вы писали:
А>while (*pw1++ = pw2++);
Вы звездочку перед pw2 не забыли?
А>По идее, сначала в цикле вынимается содержимое *pw2, но оно уже равно нулю, делее продолжения быть не должно, А>но все-таки строки копируются с завершающим нулем из *pw2
Потому что сначала вычисляется выражение *pw1++ = *pw2++, значением которого является то, что лежало по адресу *pw2, а побочными эффектами — увеличение указателей и копирование WCHAR'а из *pw2 в *pw1. Если там лежал ноль, то продолжения не будет, но ноль таки скопируется.
Я, кстати, циклы с пустым телом предпочитаю писать так:
while( *pw1++ = *pw2++ )
;
Сразу видно, что это цилк с пустым телом, а не странная описка.
Здравствуйте, Аноним, Вы писали:
А>По идее, сначала в цикле вынимается содержимое *pw2, но оно уже равно нулю, делее продолжения быть не должно,
Оператор "++" имеет больший приоритет, чем "*". Он выполняется первым (возвращает текущее значение указателя и увеличивает его). А уж потом "*" выполняется по отношению к результату предыдущей операции.
Здравствуйте, любой, Вы писали:
Л>Оператор "++" имеет больший приоритет, чем "*". Он выполняется первым (возвращает текущее значение указателя и увеличивает его). А уж потом "*" выполняется по отношению к результату предыдущей операции.
Вот уж приоритет здесь абсолютно не при чем. Выражение, стоящее в условии while вычисляется целиком, со всеми побочными эффектами. И лишь потом while смотрит на значение чтобы решить, ехать дальше или остановиться.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, любой, Вы писали:
Л>>Оператор "++" имеет больший приоритет, чем "*". Он выполняется первым (возвращает текущее значение указателя и увеличивает его). А уж потом "*" выполняется по отношению к результату предыдущей операции.
Pzz>Вот уж приоритет здесь абсолютно не при чем. Выражение, стоящее в условии while вычисляется целиком, со всеми побочными эффектами. И лишь потом while смотрит на значение чтобы решить, ехать дальше или остановиться.
Pzz>P.S. Чему вас только учат?...
— в общем-то да,
сначала (по VC++ asm-коду вынимается *pw2, затем идет запись в *pw1,
затем pw2 и pw1 увеличиваются, а лишь потом идет проверка на нуль...
Здравствуйте, roman313, Вы писали:
R>- в общем-то да, R>сначала (по VC++ asm-коду вынимается *pw2, затем идет запись в *pw1, R>затем pw2 и pw1 увеличиваются, а лишь потом идет проверка на нуль...
Здравствуйте, любой, Вы писали:
Л>Здравствуйте, roman313, Вы писали:
R>>- в общем-то да, R>>сначала (по VC++ asm-коду вынимается *pw2, затем идет запись в *pw1, R>>затем pw2 и pw1 увеличиваются, а лишь потом идет проверка на нуль...
Л>Asm-код не отражает логику языка.
В данном случае отразил правильно — всё выполнилось как и положено
Здравствуйте, Pzz, Вы писали:
Pzz>P.S. Чему вас только учат?...
не лазить в темные углы языка (с) Страуструп
тогда не придется угадывать, что в каком порядке выполняется
Здравствуйте, March_rabbit, Вы писали:
Pzz>>P.S. Чему вас только учат?... M_>не лазить в темные углы языка (с) Страуструп M_>тогда не придется угадывать, что в каком порядке выполняется
Это как раз светлые углы языка. Если они вам кажутся темными, вам надо язык какой-нибудь попроще. Паскаль, наверное, ну, или там, бейсик...