Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2010, 10:56   #1
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию Три вопрoca на засыпку для знатоков Си

Перечитывал вчера Элджера. В первой же главе узнал для себя много нового. :) Хотя эта книжка про C++, я придумал три загадки, посвящённые старому доброму Си.


___________________________________


Код:
void main()
{
	const int a = 42;
	const int* b = &a;
	const int** const c = &b;

	(c)++;
	(*c)++;
	(**c)++;
}
Какие из инкрементов корректны, а какие являются синтаксической ошибкой?


___________________________________


Код:
#include <stdio.h>

void main()
{
	puts ("What??!");
}
Что выведет на экран эта программа?


___________________________________


Код:
#include <stdio.h>

void main()
{
	// His enemy halted again, facing him, and the shadow about it reached out.
	// Fire came from its nostrils. But Gandalf stood firm.
	while ("The dark fire will not avail you!" || "Go back to the Shadow!")
		puts ("You cannot pass!");
	puts ("But even as it fell it swung its whip, and the thongs lashed about the wizard's knees, dragging him to the brink.");
}
Добавте в программу 1 символ, чтобы при запуске последнее сообщение выводилось на экран.

Последний раз редактировалось ds.Dante; 25.01.2010 в 11:43.
ds.Dante вне форума Ответить с цитированием
Старый 25.01.2010, 11:31   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Какие из инкрементов корректны, а какие являются синтаксической ошибкой?
Есть предположение, что
Код:
(**c)++;
является ошибкой.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 25.01.2010, 11:42   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
(c)++;
Ошибка, т.к. c - константный указатель.
Код:
(*c)++;
Можно.
Код:
(**c)++;
Ошибка, т.к. **c == *b, а b - указатель на константу.

Цитата:
Сообщение от ds.Dante
Что выведет на экран эта программа?
MinGW выдает "What??!", но показывает warning. Любопытно.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.01.2010, 11:48   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
void main()
{
	const int a = 42;
	const int* b = &a;
	const int** const c = &b;

	(c)++;
	(*c)++;
	(**c)++;
}
1. пытаешься изменить константный указатель
2. все нормально, ибо константен только указатель на указатель
3. пытаешься изменить константное значение

Код:
#include <stdio.h>

void main()
{
	puts ("What??!");
}
если не эту строку, то понятия не имею.

Код:
#include <stdio.h>

void main()
{
	// His enemy halted again, facing him, and the shadow about it reached out.
	// Fire came from its nostrils. But Gandalf stood firm.
	while ("The dark fire will not avail you!" || "Go back to the Shadow!")
		puts ("You cannot pass!");
	puts ("But even as it fell it swung its whip, and the thongs lashed about the wizard's knees, dragging him to the brink.");
}
с одним чет не выходит. логично применить отрицание, но нужны скобки...
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 25.01.2010 в 11:58.
pproger вне форума Ответить с цитированием
Старый 25.01.2010, 12:01   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот как )
Код:
// His enemy halted again, facing him, and the shadow about it reached out.
	// Fire came from its nostrils. But Gandalf stood firm. \
	while ("The dark fire will not avail you!" || "Go back to the Shadow!")
		puts ("You cannot pass!");
	puts ("But even as it fell it swung its whip, and the thongs lashed about the wizard's knees, dragging him to the brink.");
Кстати, подсказка в самих комментах - нужно спрятать цикл в тень )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.01.2010, 12:04   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

мда, а каменты я и не скопипастил...
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 25.01.2010, 12:15   #7
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

С первым проблем не возникло.


Цитата:
Сообщение от Sazary Посмотреть сообщение
MinGW выдает "What??!", но показывает warning. Любопытно.
Это зависит от компилятора. По-хорошему он должен обработать триграф и вывести "What|". Borland C++ 3.1 вообще не знает о них. Кстати, какой у тебя warning?


Цитата:
Сообщение от Sazary Посмотреть сообщение
нужно спрятать цикл в тень )
Ты гений. :) Не думал, что кто-то хоть близко подойдёт к решению. Плюсую.
Этот пример я взял из MSDN.

Последний раз редактировалось ds.Dante; 25.01.2010 в 12:57.
ds.Dante вне форума Ответить с цитированием
Старый 25.01.2010, 12:24   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от ds.Dante
По-хорошему он должен обработать триграф и вывести "What|".
Интересно.. Раньше не слышал о них.
Цитата:
Сообщение от ds.Dante
Кстати, какой у тебя warning?
[Warning] trigraph ??! ignored, use -trigraphs to enable
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.01.2010, 16:06   #9
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Я про триграфы тоже раньше не слышал. Спасибо за ссылочку, теперь я знаю как буду мстить своему преподу по проге =))
У нее же от такого:
Код:
??=include <stdio.h>
int main(void)
??<
        char n??(5??);

        n??(4??) = '0' - (??-0 ??' 1 ??! 2);/
        printf("%c??/n", n??(4??)");
        return 0;
??>
глаза вылезут =) А еще и все нормально компилируется.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария

Последний раз редактировалось Blade; 25.01.2010 в 16:11.
Blade вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос на засыпку...... Rukata Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 19.09.2009 23:39
Нужна помощь от знатоков excel :) VaDDok Microsoft Office Excel 7 19.03.2009 19:38
Вопрос на засыпку BuT@JL Помощь студентам 6 08.03.2009 12:56
черный ящик, на три входа и на три выхода Shanson Помощь студентам 7 30.01.2008 09:45