| 15.07.2010, 05:53 | |
|
Ответы с готовыми решениями:
1272
Элементарные программы, для лучшего понимания языка...
Литература для лучшего понимания сути программирования |
| 25.07.2010, 16:19 | |
|
0
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 27.07.2010, 00:34 [ТС] | |
|
nikkka, А вы ноктюрн сыграть смогли бы на флейте водосточных труб? ©
Добавлено через 15 часов 26 минут Где же интересные задачки?( Кончились?
0
|
|
|
Мат в 32 хода
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
|
|||||||||||
| 27.07.2010, 09:13 | |||||||||||
|
Решение №1
прошу присылать ответы в теге CUT. Добавлено через 18 минут Решение №2
Добавлено через 5 минут всё, третее потом придумаю, сейчас времени нет...
1
|
|||||||||||
|
|
|
| 27.07.2010, 10:46 | |
|
Я тоже эти 2 решения нашел, третье так и не смог, поэтому посмотрел в ответы. Там оказывается решение состоит в том, что добавляется один символ, что по-моему не совсем соответствует условию задачи. (кстати об этом решении я думал, но счел его некорректным)
Добавлено через 10 минут Помните недавно задачку, сейчас случайно в инете нашел более подробное описание, почему данный код так себя ведет. Кому интересно.
Неочевидная особенность в синтаксисе определения переменных
Предлагается совершенно невинный на вид кусок кода на C++. Здесь нет ни шаблонов, ни виртуальных функций, ни наследования, но создатели этого чудесного языка спрятали грабли посреди чистa поля. struct A { A (int i) {} }; struct B { B (A a) {} }; int main () { int i = 1; B b(A(i)); // (1) return 0; } * This source code was highlighted with Source Code Highlighter. Вопрос: какой тип у переменной b? Совсем не тот, который можно было бы предположить на первый взгляд. Анализ Конечно же, тип переменной b не B, иначе бы не было этой статьи Я не буду сразу приводить ответ, а вместо этого расскажу, как до него можно дойти, не копаясь в тысячестраничном стандарте.Для начала добавим немного отладочной печати: #include <iostream> struct A { A (int i) { std::cout << 'A';} }; struct B { B (A a) { std::cout << 'B';} }; int main () { int i = 1; B b(A(i)); // (1) return 0; } * This source code was highlighted with Source Code Highlighter. Если попробовать запустить этот код, окажется, что вообще ничего не выводится. Но если заменить строку (1) на B b(A(1)); внезапно всё начинает работать. А теперь посмотрим внимательно на вывод компилятора при максимально включенных предупреждениях $ g++ -W -Wall test.cpp x.cpp:2: warning: unused parameter ‘i’ x.cpp:6: warning: unused parameter ‘a’ x.cpp: In function ‘int main()’: x.cpp:10: warning: unused variable ‘i’ С первыми двумя строками всё понятно, действительно параметры конструкторов не используются. А вот последняя строка выглядит очень странно. Как переменная i оказалась неиспользуемой, если она используется в следующей строке? В принципе, этой информации достаточно, чтобы, немного подумав, ответить на поставленный вопрос. Но если умные мысли в голову не приходят, и хочется ещё немного поприключаться, почему бы просто не спросить компилятор? На помощь приходит RTTI. #include <iostream> #include <typeinfo> struct A { A (int i) {} }; struct B { B (A a) {} }; int main () { int i = 1; B b(A(i)); // (1) std::cout << typeid(b).name() << std::endl; return 0; } * This source code was highlighted with Source Code Highlighter. При компиляции GCC 4.3 результатом выполнения этой программы является строка F1B1AE в которой зашифрована нужная нам информация о типе переменной (конечно, другой компилятор выдаст другую строку, формат вывода type_info::name() в стандарте не описан и оставлен на усмотрение разработчика). Узнать же, что означают эти буквы и цифры, нам поможет c++filt. $ c++filt -t F1B1AE B ()(A) Вот и ответ: это функция, принимающая на вход параметр типа A и возвращающая значение типа B. Причина Осталось понять, почему наша строка проинтерпретировалась таким неожиданным способом. Всё дело в том, что в объявлении типа переменной лишние скобки вокруг имени игнорируются. Например, мы можем написать int (v); и это будет означать в точности тоже самое, что int v; Поэтому многострадальную строку (1) можно без изменения смысла переписать, убрав лишнюю пару скобок: B b(A i); Теперь невооружённым взглядом видно, что b это объявление функции с одним аргументом типа A, которая возвращает значение типа B. Заодно мы объяснили странный ворнинг о неиспользованной переменной i — действительно, она не имеет никакого отношения к формальному параметру i. Workarounds Нам осталось только объяснить компилятору, что же на самом деле мы от него хотим — то есть, получить переменную типа B, проинициализированную переменной типа A. Самый простой способ — добавить лишних скобок, вот так: B b((A(i))); или так: B b((A)(i)); Этого достаточно, чтобы убедить парсер, что это не объявление функции. Как альтернативу, можно использовать форму вызова конструктора с помощью присваивания, если только конструктор не объявлен explicit: B b = A(i); Несмотря на наличие знака '=', никакого лишнего копирования здесь не происходит, в чём можно легко убедиться, заведя в классе B приватный конструктор копирования. А можно просто ввести дополнительную переменную: A a(i); B b(a); Правда, при этом потребуется лишнее копирование переменной a, но во многих случаях это приемлемо. Выберите тот способ, который кажется вам более понятным
6
|
|
| 27.07.2010, 10:57 | |
|
0
|
|
| 27.07.2010, 11:28 | ||
|
Не по теме:
Большего сказать не могу, а то решение станет очевидным)))
0
|
||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 27.07.2010, 12:47 | ||
|
1
|
||
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|||||||
| 27.07.2010, 13:22 | |||||||
|
Третье решение
2
|
|||||||
|
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
|
|||||||
| 27.07.2010, 14:00 | |||||||
|
По теме: Попробуйте реализовать калькулятор, который бы умел считать вводимые пользователем выражения, например (2+10)*2+1.0/2 --- P.S. Ну и ещё такое несложное задание: написать макрос, котрый бы выполнял функцию такого цикла как foreach, т.е.
0
|
|||||||
|
Мат в 32 хода
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
|
|
| 27.07.2010, 14:11 | |
|
rangerx, буду признателен если кто нить обяснит что такое макрос
![]() Добавлено через 1 минуту Хохол, блин, почему я сам не додумался... спасибо
0
|
|
|
|
|||||||
| 27.07.2010, 14:28 | |||||||
1
|
|||||||
|
Мат в 32 хода
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
|
|
| 27.07.2010, 14:33 | |
|
Kastaneda, но для этого же функции существуют...
1
|
|
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|||||||
| 27.07.2010, 14:41 | |||||||
Есть также существенные различия между макросами и функциями:
1
|
|||||||
|
Мат в 32 хода
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
|
|||||||
| 27.07.2010, 14:48 | |||||||
|
спасибо!... Добавлено через 3 минуты Nameless One, а что будет если я создам макрос который выводит ВТОРОЙ элемент массива, а передам ему тип int? Добавлено через 53 секунды будет то же самое как если бы я написал
0
|
|||||||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|||||||||
| 27.07.2010, 15:00 | |||||||||
Добавлено через 7 минут
В данном случае лучше было бы использовать шаблонные функции и специализировать шаблон для const char*. Добавлено через 2 минуты
2
|
|||||||||
|
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
|
||||||||
| 27.07.2010, 15:24 | ||||||||
0
|
||||||||
|
Мат в 32 хода
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
|
||
| 27.07.2010, 15:28 | ||
|
тело макроса заключено в собки "(" и ")", как я понял.
вот только правельно ли я понял... Добавлено через 2 минуты чё за... почему a=b?!?!?!?! О.О
0
|
||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||||||||||||||||||
| 27.07.2010, 15:38 | ||||||||||||||||||||||
|
Тело макроса - это все то, что идет после #define ИМЯ_МАКРОСА(ПАРАМЕТРЫ)
Скобки нужны для того, чтобы не напутать с приоритетами операций. К примеру, если проанализировать следующую программу:
Также параметрами макроса могут быть не отдельные объекты, а выражения, поэтому в теле макроса параметры лучше тоже заключать в скобки. Наиболее "правильный" вариант должен был выглядеть так:
К макросам нужно относиться с осторожностью, что уже показал rangerx. Добавлено через 2 минуты
1
|
||||||||||||||||||||||
| 27.07.2010, 15:38 | |
|
Помогаю со студенческими работами здесь
220
Набор задачь для тренировки и улучшения понимания программирования Проверить на правильность и закомментировать весь код для лучшего понимания Нужны задачи для тренировки
Нужны задачи для тренировки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи
и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|