![]() |
|
Модераторы: bsa |
![]()
|
|
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
1. Почему не рекомендуется обозначать приоритеты при помощи пробелов: 4 + 3*2 - 34/9 ? (Джесс Либерти)
2. Чем является имя массива - ссылкой или указателем на 1й элемент? А имя объекта? 3. В одной книжке увидел код:
Вопросы: а - зачем возврат после передачи исключения? б - как компилятор выбирает какой метод использовать если они одинаковые? какой смысл в таком дубликате? 4. Если я правильно понимаю, то при срабатывании исключения стек вызова прокручивается обратно, пока объект искючения не найдет обработчик (то есть блок CATCH). Вопрос: каким образом объект найдет обработчик, если его еще нет в стеке вызова так как блок CATCH находится ПОСЛЕ try? Вроде как в callstack попадают уже вызванные функции, но к функциям блока try еще не было обращений. Это сообщение отредактировал(а) wowka19 - 17.7.2012, 11:48 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
1. потому что пробелы компилятору не говорят о приоритетах. Поэтому, ты можешь написать 1+2 * 3 и получить не то, что ожидаешь. Все программисты знают приоритеты базовых математических операций. Поэтому, их отдельно обозначать не надо. Другое дело логические, побитовые и пр. Их лучше всегда явно указывать скобками. Так как не каждый их знает наизусть. И вообще, gcc ругается на выражения a || b && c. Так как не все видят, что выполняется оно справа на лево.
2. имя массива не является ни тем, ни другим. имя объекта тоже. Имя - это имя. Другое дело, что в месте использования переменная-массив может быть преобразована в указатель на первый его элемент. В то же время, переменная-объект может быть "преобразована" в ссылку (точнее, для нее автоматически создана ссылка, если это требуется функции, например). 3. а) скорее всего, таким образом просто было отключено предупреждение об отсутствии возвращаемого значения. Но возможно, автор хотел сначала поместить throw под if (с инверсным условием, конечно), а затем передумал, но не подчистил код. б) методы не одинаковые. Если у тебя в данном месте есть возможность менять состояние объекта Array, то он выберет первый вариант, а если нет, то второй. 4. я не знаю реального механизма работы исключений, но подозреваю, что при входе в каждый блок try выставляется в стеке метка об этом, когда идет разворачивание стека, и встречается эта метка, то проверяется, подходит ли кинутое исключение под отлавливаемое блоком catch. Если подходит, то он начинает его выполнение, если нет, то происходит продолжение раскрутки. А то что блок catch стоит после try тебя вообще не должно никак заботить. Тебя же не смущает, что в операторе for третья операция (после второй точки с запятой) выполняется после основного блока цикла? А try/catch это аналог if (true){A}else{B}, только с возможностью попасть в блок {B} из любого места блока {A} (в т.ч. и из вызванных функций). |
|||
|
||||
| wowka19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
по 1 и 2 вроде понятно.
по 3: то есть:
и:
так? 4. Понятно, что try/catch некоторая интерпретация(модификация) if/goto. Если я правильно понял - catch не обязательно должен стоять после try? И его (catch) можно засунуть намного раньше (ПЕРЕД) первого try, чтобы в случае срабатывания исключения стек раскрутился от try до catch, попутно разрушая все созданные объекты? Это сообщение отредактировал(а) wowka19 - 17.7.2012, 13:31 |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Вернёт ссылку на int. Во втором случае константную ссылку, а в первом - обычную. Разница в том, что ты можешь написать так
и во второй элемент массива запишется 42 а вот так
ты сделать не сможешь (компилятор не даст) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
borisbn
Наскоько я знаю - const не дает изменить переменную. Тогда зачем явно прописывать const int& Array::operator[](int offSet) const? Разве без этого дубликата компилятор позволит изменение объекта (B[ 2 ] = 42)? |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
позволит. кста, ведь довольно просто проверить... зачем для этого задавать вопрос на форуме ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
borisbn, проверил. Итог - НЕ позволит. Он даже не даст вызвать B[2], так как operator[]() не является const-методом, а не const-методы у const-объекта компилятор вызвать не позволит. Вроде разобрался;) |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
уууупс. не обратил внимание, что B объявлен как
тогда да. не позволит -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| alsav22 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.4.2012 Репутация: нет Всего: нет |
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
lvalue всегда константно. Так как оно существует временно (т.е. нет постоянного места хранения в памяти). А при использовании массива происходит преобразование объекта "массив" в указатель на первый его элемент. В случае передачи в функцию происходит создание локальной переменной, которой присваивается данный указатель. Именно поэтому, "его" можно менять. А на самом деле, меняется локальная переменная вызванной функции. Поэтому, не стоит путать людей.
|
|||
|
||||
| alsav22 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.4.2012 Репутация: нет Всего: нет |
Это сообщение отредактировал(а) alsav22 - 23.7.2012, 01:29 |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
зависит от объявления этого указателя.
bsa, имел в виду rvalue -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
точно. главное, сижу, туплю в монитор. Думаю, что-то тут не то. Но так и не допер... Спать видимо пора была.
|
|||
|
||||
| alsav22 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.4.2012 Репутация: нет Всего: нет |
Это сообщение отредактировал(а) alsav22 - 23.7.2012, 20:08 |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |