Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос на собеседовании 
:(
    Опции темы
J0ker
Дата 22.9.2008, 04:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Rickert @  22.9.2008,  04:08 Найти цитируемый пост)

Код

    str[i] = str[i] + str[max - (i + 1)];
    str[max - (i + 1)] = str[i] - str[max - (i + 1)];
    str[i] = str[i] - str[max - (i + 1)];

Код

str[i] ^= str[max - (i + 1)] ^= str[i] ^= str[max - (i + 1)];


Это сообщение отредактировал(а) J0ker - 22.9.2008, 04:30


--------------------
user posted image
PM MAIL   Вверх
Rickert
Дата 22.9.2008, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Кто больше? smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
J0ker
Дата 22.9.2008, 05:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Rickert @ 22.9.2008,  05:01)
Кто больше? smile

нет
у кого длиннее


--------------------
user posted image
PM MAIL   Вверх
Torsten
Дата 22.9.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 10.6.2008
Где: Pskov

Репутация: 3
Всего: 7



Цитата(Paspartu @  21.9.2008,  21:28 Найти цитируемый пост)
дано:char* str = "12345";и усе!перевернуть все символы не используя буфер т.е. получить я так понял указатель на "54321", по google - л, но хочется понять принцип, и как зная только лишь указатель это можно сделать?

хм ... в каком то из недавних номеров журнала хакер (летнем)  КК показыавл как это сделать.

Но реально непонятному кому это нужно, если коде используются такие нестадартные механизмы - я не завидую тому кто будет такой код разбирать и дописывать. Хотя бы потому что это задача легко решается если проходить от конца строки к началу - всего лишь алгоритм.

Это сообщение отредактировал(а) Torsten - 22.9.2008, 12:27
--------------------
We have no begining, we have no end. We are infinite.
PM MAIL   Вверх
UnrealMan
Дата 22.9.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(J0ker @ 22.9.2008,  05:29)
Код

str[i] ^= str[max - (i + 1)] ^= str[i] ^= str[max - (i + 1)];

Тут undefined behavior.
PM MAIL   Вверх
J0ker
Дата 22.9.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(UnrealMan @ 22.9.2008,  13:04)
Цитата(J0ker @ 22.9.2008,  05:29)
Код

str[i] ^= str[max - (i + 1)] ^= str[i] ^= str[max - (i + 1)];

Тут undefined behavior.

в каком месте?


--------------------
user posted image
PM MAIL   Вверх
UnrealMan
Дата 23.9.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Между двумя соседними точками следования нельзя дважды модифицировать один и тот же скалярный объект.

Это сообщение отредактировал(а) UnrealMan - 23.9.2008, 14:08
PM MAIL   Вверх
J0ker
Дата 23.9.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(UnrealMan @ 23.9.2008,  14:08)
Между двумя соседними точками следования нельзя дважды модифицировать один и тот же скалярный объект.

здесь нет соседних точек:
Код

str[i].operator^=( str[max - (i + 1)].operator^=( str[i].operator^=( str[max - (i + 1)] ) ) );

так что всё тип-топ

Это сообщение отредактировал(а) J0ker - 23.9.2008, 18:16


--------------------
user posted image
PM MAIL   Вверх
UnrealMan
Дата 24.9.2008, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(J0ker @ 23.9.2008,  19:13)
Цитата(UnrealMan @ 23.9.2008,  14:08)
Между двумя соседними точками следования нельзя дважды модифицировать один и тот же скалярный объект.

здесь нет соседних точек:
Код

str[i].operator^=( str[max - (i + 1)].operator^=( str[i].operator^=( str[max - (i + 1)] ) ) );

Ну, тут-то их конечно нет, т.к. такая программа некорректна smile

Что касается предыдущего твоего примера, то там две соседние точки следования обязательно будут. Первая точка следования будет либо такой:

Цитата(1.9/17)
When calling a function (whether or not the function is inline), there is a sequence point after the evaluation
of all function arguments (if any) which takes place before execution of any expressions or statements in
the function body.

либо такой:

Цитата(1.9/16)
There is a sequence point at the completion of evaluation of each full-expression

Следующая точка следования будет согласно абзацу 1.9/16.

Функция, о которой идёт речь при упоминании случая с 1.9/17, - это та, что содержит expression-statement, коим является твой кусок кода.

Цитата(J0ker @ 23.9.2008,  19:13)
так что всё тип-топ

То есть хреново smile

PM MAIL   Вверх
J0ker
Дата 24.9.2008, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



изучаю вопрос

Это сообщение отредактировал(а) J0ker - 24.9.2008, 05:37


--------------------
user posted image
PM MAIL   Вверх
J0ker
Дата 24.9.2008, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



да, согласен, был неправ (5/4)
плюсик вам
Цитата(UnrealMan @  24.9.2008,  01:31 Найти цитируемый пост)
Ну, тут-то их конечно нет, т.к. такая программа некорректна smile

программа корректна - эквивалентность некорректна - прояснилось из 5/2

Однако хочу уточнить - согласно тому-же 5/2 - при перегруженном операторе ^= undefined behavior исчезает. Я правильно понимаю?

UPD упс, не могу поставить плюсик. Обязательно поставлю когда наберу 100 постов   smile 

Это сообщение отредактировал(а) J0ker - 24.9.2008, 07:13


--------------------
user posted image
PM MAIL   Вверх
vinter
Дата 24.9.2008, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(J0ker @  24.9.2008,  08:09 Найти цитируемый пост)
UPD упс, не могу поставить плюсик. Обязательно поставлю когда наберу 100 постов 

поставил


--------------------
Мой блог
PM MAIL WWW   Вверх
UnrealMan
Дата 24.9.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(J0ker @  24.9.2008,  08:09 Найти цитируемый пост)
программа корректна 

Напомню, что в теме речь шла про массивы char-ов, а с char-ами такая бодяга не пройдёт.

Цитата(J0ker @  24.9.2008,  08:09 Найти цитируемый пост)
Однако хочу уточнить - согласно тому-же 5/2 - при перегруженном операторе ^= undefined behavior исчезает. Я правильно понимаю?

Перегрузка оператора заключается в определении функции с именем operator operator, где хотя бы один параметр (явный или неявный) имеет пользовательский тип или тип, представляющий собой ссылку на пользовательский тип. На такую функцию, как и на все другие, распространяется правило

Цитата(1.9/17)
When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of all function arguments (if any) which takes place before execution of any expressions or statements in the function body. There is also a sequence point after the copying of a returned value and before the execution of any expressions outside the function


Это сообщение отредактировал(а) UnrealMan - 24.9.2008, 13:04
PM MAIL   Вверх
J0ker
Дата 24.9.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(UnrealMan @  24.9.2008,  12:46 Найти цитируемый пост)
Напомню, что в теме речь шла про массивы char-ов, а с char-ами такая бодяга не пройдёт.

именно это и ввело меня в заблуждение - считал операторы простых типов полностью эквивалентными по реализации операторам классов (за исключением операторов || и &&). Естественно я понимаю что .operator op к простым типам не применим синтаксически.


Цитата(vinter @  24.9.2008,  08:50 Найти цитируемый пост)
поставил 

спасибо  smile 


--------------------
user posted image
PM MAIL   Вверх
Maka6er
Дата 24.9.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 27.2.2007
Где: Киев

Репутация: нет
Всего: 3



И я нас... сделаю свой вклад smile С указателем, без буфера:
Код

void rev(char *str)
{
    char *start = str;
    for(;*str;str++)
        ;
    for(--str;start < str; --str, start++) {
        *str = *str^*start;
        *start = *str^*start;
        *str = *str^*start;
    }
}

PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0977 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.