Вопрос № 146940: Чем отличается в С++ оператор i++ от ++i? Спасибо за помощь! <img src="http://rusfaq.ru/images/Forum/1.gif" border="0"> ...Вопрос № 146967: Здравствуйте, уважаемые эксперты. Недавно начал изучение языка и при решении задач столкнулся вот с таким "граница выравнивания для типа int равна 4". Хотел узнать что ето значит? Речь идет о классах, хотя я думаю, что это не важно....Вопрос
№ 147065: Здравствуйте!!! Помогите пожалуйста написать программу!! . 1. Написать функцию char* sort(char **strings, int size). Функция получает в качестве параметра указатель на массив из указателей типа char *, каждый из которых ссылается на строку...
Вопрос № 146.940
Чем отличается в С++ оператор i++ от ++i? Спасибо за помощь!
Отправлен: 12.10.2008, 17:33
Вопрос задал: Sant87 (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Alexandr A. Rakunov
Здравствуйте, Sant87! i++ - сначала вернет предыдущее значение, потом увеличится на единицу ++i - сначала увеличится на единицу, потом вернет значение Пример: int i = 5; int b = i++; // тут b = 5, i = 6 int c = ++i; // с = 7; i = 7
Если нужно просто увеличить на единицу, то в общем случае эффективней является форма (++i)
Ответ отправил: Alexandr A. Rakunov (статус: 7-ой класс)
Ответ отправлен: 12.10.2008, 20:15
Отвечает: Vest
Здравствуйте, Sant87! Когда используется отдельно, то ни чем: i++; ++i; но внутри сложных конструкций увеличение переменной происходит либо после выполнения оператора (первый вариант), либо до (второй). Например: i = 10; GetSomething(i++); // GetSomething(10); // i == 11;
i = 10; GetSomething(++i); // GetSomething(11); // i == 11;
это сделано для сокращения при программировании. Но ни в коем случае не используйте конструкции вида: j = i++ + ++i - i++; так как
порядок вычисления это вещь, зависящая от компилятора... то есть ваш код не то что будет плохо читаемым (хоть и работающим у вас) но и плохо переносимым. А вообще, постарайтесь не пользоваться сишным стилем, чтобы потом не заставлять бедных программистов долго думать над вашей короткой, но сложной записью. Компьютеры сейчас не настолько плохие, чтобы усложнять себе жизнь. До свидания
--------- "Халявы не бывает" (c)
Ответ отправил: Vest (статус: 6-ой класс)
Ответ отправлен: 13.10.2008, 18:06
Вопрос № 146.967
Здравствуйте, уважаемые эксперты. Недавно начал изучение языка и при решении задач столкнулся вот с таким "граница выравнивания для типа int равна 4". Хотел узнать что ето значит? Речь идет о классах, хотя я думаю, что это не важно.
Отвечает: Alexandr A. Rakunov
Здравствуйте, Губайдуллин Дамир Лутфуллович! Это означает, что адрес, по которому int будет располагаться в памяти кратен 4.
Ответ отправил: Alexandr A. Rakunov (статус: 7-ой класс)
Ответ отправлен: 12.10.2008, 21:47 Оценка за ответ: 4
Отвечает: Olegzp
Здравствуйте, Губайдуллин Дамир Лутфуллович! Все просто, тип int имеет размерность 4 байта, компилятор пытается оптимизировать на наилучший сбособ доступа. Для проверки размерности типа данных можно использовать SIZEOF(тип данных)
Ответ отправил: Olegzp (статус: 3-ий класс)
Ответ отправлен: 13.10.2008, 14:26 Оценка за ответ: 3
Отвечает: Vest
Здравствуйте, Губайдуллин Дамир Лутфуллович! Дополню чужие ответы: идея такая, что в структуре (ну или классе), поля располагаются удобным для компилятора образом, точнее изменяются так, чтобы ему было уобно и быстро ими пользоваться. Размер структуры равен сумме размеров всех его полей и плюс некоторая величина которая может быть минимум равна 0. Поясняю: допустим имеем структуру с двумя int полями. Её размер будет равен 4 + 4 = 8. Если вы первое поле поменяете на char то вы возможно ожидаете, что размер
будет равен 1 + 4 = 5, или же наоборот (если второе) 4 + 1 = 5. Так вот, компилятор "выравнивает" поля структуры так, чтобы их длинна была равна по возможности длинне самого большого поля. Я, к сожалению, точно не помню порядок - это надо поспрашивать у Бьярна Страуструпа в его книге. Но просто представьте, если вы переведете два своих поля в цепочку байт, то вы обнаружите что только 5 из них несут смысловую нагрузку, а 3 - представляют собой некий мусор (или
пустоту): x x x x - - - x (первые 4 байта - это интеджер, а последний 1 - чар). В общем, помотрите информацию касающуюся aligned fields in structures. И поймете. также вы там найдете и битовые поля... тоже знаете ли интересно :) Пока
--------- "Халявы не бывает" (c)
Ответ отправил: Vest (статус: 6-ой класс)
Ответ отправлен: 13.10.2008, 18:13 Оценка за ответ: 5 Комментарий оценки: Вот теперь почти все понятно. Спасибо большое!
1. Написать функцию char* sort(char **strings, int size). Функция получает в качестве параметра указатель на массив из указателей типа char *, каждый из которых ссылается на строку. Функция "упорядочивает" строки в лексикографическом порядке, переставляя не строки, а указатели на них. Для сравнения строк использовать функцию: int strcmp( const char *string1, const char *string2 );// <string.h> Return Value
The return value this function indicates the lexicographic relation of string1 to string2.
Value Relationship of string1 to string2
< 0 string1 less than string2 0 string1 identical to string2 > 0 string1 greater than string2
Отправлен: 13.10.2008, 15:11
Вопрос задал: Saidart (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Verena
Здравствуйте, Saidart! Вот вариант решения, применён алгоритм быстрой сортировки. Подробное описание алгоритма можно посмотреть в Википедии: здесь. Код в приложении. Удачи!
Приложение:
--------- Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: Практикант)
Ответ отправлен: 14.10.2008, 15:56 Оценка за ответ: 5