2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 414

Почему нельзя подставлять переменные в выражения #if #else?

26.03.2014, 14:25. Показов 3347. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему код работает, не должен же, потому что выражение стоящее после #if вычисляется на этапе компиляции, переменные подставлять нельзя??

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <iostream>
using namespace std;
 
int a = 9;
 
int main(void){
#if a>99
    printf("Kompiliruet, esli a bol'she 9\n");          
#else
    printf("Kompiliruet, esli a men'she 9\n");
#endif
 
    char ch = getchar();
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.03.2014, 14:25
Ответы с готовыми решениями:

Почему в switch нельзя определять переменные?
int main() { setlocale(LC_ALL, &quot;Russian&quot;); int n; std::cout &lt;&lt; &quot;Введите число: &quot;; std::cin &gt;&gt; n; switch...

Почему нельзя использовать глобальные переменные
Здравствуйте, собственно вышел сиз данным вопросом в гугл и на стаке нашел такой ответ: 1)Глобальные переменные в большинстве случаев...

Почему нельзя использовать в операторе case переменные, которые определены как #define
Я не понимаю, почему Visual Studio ругается на строку с case в коде. Вроде все правильно. Если там написать напрямую цифру, тогда все...

27
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2014, 18:43
Студворк — интернет-сервис помощи студентам
Тем не менее препроцессор может прочитать и то, и другое. И так как на ТС он не ругался, декларацию, причём, даже не константы, а переменной, он понял и девятку подставил. Хотя по идее должен был ругаться отборной нецензурщиной.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
26.03.2014, 18:59
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
смотрю как работает, читаю книгу
Было бы кстати неплохо для расширения кругозора узнать, что это за книга и какой у вас компилятор.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
26.03.2014, 19:13
Цитата Сообщение от taras atavin Посмотреть сообщение
И так как на ТС он не ругался, декларацию, причём, даже не константы, а переменной, он понял и девятку подставил
Ничего он не подставил. Он ищет макроопределение обозначенное как а для сравнения с 99, естественно такого нет. Результат будет всегда одинаковый, независимо от того что задано в переменной а.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2014, 19:20
Тогда бы он ругался по-непечатному.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
26.03.2014, 19:24
Цитата Сообщение от taras atavin Посмотреть сообщение
Тогда бы он ругался по-непечатному.
Не обязан. У препроцессора более простое отношение ко всем: протестируй разные варианты в своем окружении и убедишься. У него философия простая:
нет макропределения а, значит в условии сравнить невозможно, ну что же - выполняем тогда ветку else.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2014, 19:51
Это когда
C++
1
#ifdef a
, то есть проверяется существование, а не значение. А ошибки должны приводить к тому, что кода просто не будет.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
26.03.2014, 20:06
короче протестировал я на двух компиляторах
вот такую конструкцию
const int a=10;
C
1
2
3
4
5
6
#if a>5
...................
#else
 
.....................
#endif
в обоих отрабатывается ветка #else
но если VS молчит как партизан
то CodeVision
честно сказал
Warning: C:\prjAvr\Samkov\Mega8_ver1_0\convertDmx .c(11): undefined symbol 'a', assumed zero
правда не ошибка а предупреждение
так что DrOffset, прав
Цитата Сообщение от DrOffset Посмотреть сообщение
Он ищет макроопределение обозначенное как а для сравнения с 99, естественно такого нет. Результат будет всегда одинаковый, независимо от того что задано в переменной а.
2
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
26.03.2014, 20:10
taras atavin, ты о чем вообще?
Поменяй в том примере а-малую, на B, например, и результат не изменится. А после проверки добавь #define B 100, увидишь что начнет срабатывать первое условие. Как еще тебе объяснять - не знаю.

Не по теме:

Это такие дикие основы, что даже странно, почему тут развели тему на 3 страницы.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.03.2014, 20:10

Почему локальные переменные методов нельзя изменять в анонимных классах?
Почему Java защищает от изменения локальные переменные методов, когда пытаешься их изменить в анонимном внутреннем классе? Она требует,...

Можно ли в запросе фильтра подставлять переменные
В два грида выводятся отфильтрованые данные нельзя-ли в место запроса &quot;dv1.RowFilter = &quot;name='сергей'&quot; -- подменить слово -...

Почему нельзя командой copy скопировать системные файлы на дискету? Почему?
Пожалуйсат, подскажите, весь интернет перерыла, вот почему нельзя? что нельзя знаю, а по какой причине?

Почему в локальном классе доступны финальные переменные или переменные инициализированные при объявлении
Добрый вечер. Объясните пожалуйста, почему в локальном классе могут использоваться только финальные переменные или переменные которые были...

На рабочем столе нельзя перетаскивать ярлыки, нельзя копировать файлы и нельзя их вставлять
После загрузки компьютера вылезла ошибка, что кокойто файл windows неможет прочесть было предложено открыть программу CHKDSK, после этого ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

Новые блоги и статьи
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru