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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2013, 00:43   #1
RIKISHI007
Пользователь
 
Регистрация: 04.07.2013
Сообщений: 27
Восклицание Препроцессор. Неоюходимо разобраться

http://acmp.ru/?main=task&id_task=327

Задачу сдал правильно. Услышав, что препроцессор работает гораздо быстрее обычного кода, начал работать через него. Но постепенно начинаю привыкать. Многие программисты говорят, что это очень опасно использовать. Правильно ли я сделал, либо у вас есть альтернативы. Укажите мне на ошибки и недочёты. Но задачу я сдал. Очень хочу услышать ваше мнение о препроцессоре C

Кстати с препроцом тесты процел за 0.008 сек. Без препроца - 0.576

Случайность ли?

Код:
#include <iostream>
#include <cstdio>
#define y 10
using namespace std;
int main()
{

     int N, a[y], B, G, S1;
     freopen("input.txt", "r", stdin);
     freopen("output.txt", "w", stdout);
     cin >> N;
     for (int i = 0; i < N; i++)
     {
         cin >> a[i];

         #define B (a[i] - 1)
         #define G (a[i] + 1)
         #define R ( B/100000 + B/10000%10 + B/1000%10 == B%10 + B%100/10 + B%1000/100 || G/100000 + G/10000%10 + G/1000%10 == G%10 + G%100/10 + G%1000/100  ? "Yes" : "No")

         cout << R << '\n';

         #undef R
         #undef B
         #undef G

     }




}
RIKISHI007 вне форума Ответить с цитированием
Старый 06.08.2013, 02:42   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Случайность. Препроцессор производит простую текстовую замену и отрабатывает до запуска компилятора. Таким образом, компилятор получает на вход следуюий код:
Код:

// куча объявлений из iostream и cstdio

using namespace std;
int main()
{

     int N, a[10], B, G, S1;
     freopen("input.txt", "r", stdin);
     freopen("output.txt", "w", stdout);
     cin >> N;
     for (int i = 0; i < N; i++)
     {
         cin >> a[i];
         cout << ( (a[i] - 1)/100000 + (a[i] - 1)/10000%10 + (a[i] - 1)/1000%10 == (a[i] - 1)%10 + (a[i] - 1)%100/10 + (a[i] - 1)%1000/100 || (a[i] + 1)/100000 + (a[i] + 1)/10000%10 + (a[i] + 1)/1000%10 == (a[i] + 1)%10 + (a[i] + 1)%100/10 + (a[i] + 1)%1000/100  ? "Yes" : "No") << '\n';
     }




}
Насколько сильно это отличается от Вашего первоначального кода, не могу знать. Сам по себе, препроцессор никаких вычислений не производит, потому "ускорить" программу тоже не может по определению. Кроме того, препроцессор ничего не знает о синтаксисе C/C++, потому он может произвести подстановки, которые приведут к ошибкам на этапе компиляции, или, что хуже, неверному поведению программы. Ошибки, привенесённые при использовании препроцессора, найти очень трудно, т.к. его действия невозможно просматривать в отладчике.
Короче, за редким исключением, не стоит пользоваться препроцессором. Вместо него можно писать небольшие функции, современные компиляторы умеют встраивать их по месту вызова.
netrino вне форума Ответить с цитированием
Старый 06.08.2013, 05:02   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Я думаю также как netrino, хотя один парень недавно грил мне что препроцессор таки что-то решает в МКК - http://forum.codeby.net/topic51689.html . Там я описал свое мнение по этому поводу и жду когда он найдет время провести нормальный эксперимент со своим МКК ).
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Препроцессор. Расшифровка Sna1L Общие вопросы C/C++ 2 12.03.2012 12:11
Препроцессор Delphi Warn Общие вопросы Delphi 3 19.12.2011 20:46
Разобраться Nempak Общие вопросы C/C++ 2 27.03.2011 14:06
Препроцессор: определение длины строки Пепел Феникса Общие вопросы C/C++ 11 10.02.2011 21:20
C++, препроцессор, как из "int" сделать "char"? Максай Помощь студентам 3 05.09.2008 08:16