-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
||||||
1 | ||||||
Странное поведение аргументов по умолчанию29.11.2017, 20:10. Показов 527. Ответов 7
Метки нет (Все метки)
Вот элементарный пример:
Вроде компилятор должен возразить, указав, что аргументы по умолчанию различны, однако все работает, ну как написано. Добавлено через 2 часа 52 минуты Кстати, для кого то может это и не новость, а я с удивлением ещё обнаружил, что в качестве умолчальных значений для аргументов со значениями по умолчанию можно брать значения любых выражений, которые вычисляются в тип данного аргумента или хотя бы в тип, который допускает приведение в тип данного аргумента, но с одним маленьким исключением. Все ПЕРЕМЕННЫЕ и КОНСТАНТЫ, которые используются для вычисления этих умолчальных значений, должны быть определены на глобальном уровне. И тут снова вопрос, это так и должно быть или это специфика от Microsoft?
0
|
29.11.2017, 20:10 | |
Ответы с готовыми решениями:
7
Странное поведение функции с переменным количеством аргументов Странное расположение в памяти аргументов функции с неизвестным количество аргументов Странное поведение странное поведение |
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|||||||||||
29.11.2017, 20:28 | 2 | ||||||||||
Потому, что они объявлены в разных областях видимости.
0
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|
29.11.2017, 20:33 [ТС] | 3 |
Да у Вас тут пример не на значения аргументов по умолчанию, а на перегрузку.
Это разные вещи.
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
29.11.2017, 20:40 | 4 |
Вы пост целиком прочитали? Первый пример тоже на перегрузку?
Второй пример показывает как объявление функций в разных областях видимости на самом деле работает
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,076
|
||||||
29.11.2017, 20:55 | 5 | |||||
С чего бы это вдруг? Почему вы видите в этом проблему вообще?
Аргументы по умолчанию к самой функции вообще не имеют никакого отношения. Сама функция "внутри" ничего об аргументах по умолчанию не знает и не должна знать. Аргументы по умолчанию - это сущности, живущие снаружи, в том контексте из которого функция вызывается. В разных "контекстах" вы можете задавать разные наборы аргументов по умолчанию, пока они не конфликтуют друг с другом. Причем вы можете также "добавлять" новые аргументы по умолчанию в последовательные объявления одной и той же функции в одной и той же области видимости
1
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|
29.11.2017, 21:07 [ТС] | 6 |
Вы значете я вообще считал, что вот эти аргументы по умолчанию, они как бы ВКОМПИЛИРОВАНЫ в функцию, но по всей видимости я ошибался.
Тем более, во всех учебниках говорится примерно следующее: Что аргументы по умолчанию определяются только в ОДНОМ месте, а именно или в прототипе, или в заголовке функции при отсутствии прототипа, но не в обеих местах сразу, даже если значения этих аргументов полностью совпадают. А оказывается, что немного не так. Точнее именно так, но только с поправкой на то, что вот это все находится в одной и той же области видимости. То есть в одной области видимости нельзя иметь и прототип и определение функции, содержащие значения аргументов по умолчанию. А в разных областях, да сколько угодно, что в общем и демонстрирует мой пример. Мне кажется такое поведение странным. Гораздо лучше, как мне кажется, было бы то, чтобы все прототипы, неважно гле они указаны, обязаны быть согласованными друг с другом по значениям умолчальных аргументов. Ну и второе, это то, что я всегда считал, что для умолчальных аргументов могут использоваться только литералы, ну те значения после знака равенства, а оказывается можно использовать и переменные и функции, главное, чтобы они не были локальными.
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,076
|
|
29.11.2017, 21:33 | 7 |
В этом утверждении (хоть и несколько косноязычном), речь идет об одной и той же области видимости и его следует воспринимать, как относящееся к каждому конкретному аргументу в отдельности. То есть одному и тому же аргументу нельзя в нескольких местах назначить значение по умолчанию, даже если эти значения совпадают.
Но как только речь заходит о разных аргументах, то назначать им значения по умолчанию можно независимо, в совершенно разных местах. Нет необходимости концентрировать все назначения в одном месте, как показано в моем примере выше. Требуется только, чтобы в каждый момент времени все параметры с аргументами по умолчанию образовывали непрерывную последовательность в конце списка параметров. В разных областях видимости можно творить вообще, что угодно. Это правильно. И на практике обычно именно так и поступают, чтобы не было ненужных сюрпризов. Но возможность устроить вот такой вот "раздрай" в языке есть.
1
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|
29.11.2017, 21:58 [ТС] | 8 |
Вот уважаемый TheCalligrapher все теперь встало на свои места.
Тока хотелось бы, чтобы все вот это излагалось в учебниках и жирным шрифтом на видном месте, а не так чтобы доходить до всего самому и не быть уверенным, что может так не есть на самом деле, а то что получается может быть отнесено на специфику конкретного компилятора.
0
|
29.11.2017, 21:58 | |
29.11.2017, 21:58 | |
Помогаю со студенческими работами здесь
8
Странное поведение Странное поведение Странное поведение с БД Странное поведение! Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |