Не верь тому, кто говорит красиво – в его словах всегда игра.
Поверь тому, кто молчаливо творит красивые дела.
Омар Хайям

Меню навигации для мобильных

Изучаю С, помогите разобраться с кодом.

Автор Nikopol, 06 Июнь, 2020, 04:08

« предыдущая - следующая »

Nikopol

Привет
Изучаю С вот по этому курсу.
И на уроке:

Возник вопрос
Там используются константы:
#if     
#elif  
#else  
#endif
Но если в место констант использовать операторы
if     
elif  
else  
endif
То получим тоже самое.
В чем разница? И где используется первое написание и где второе?

Мой код для проверки во такой:
#include <stdio.h>
#define P 2
int main()
{
	#if    P == 1 
	printf ("Выполняется ветка 1 P=%d\n", P);     
	#elif  P == 2 
	printf ("Выполняется ветка 2 P=%d\n", P);
	#else  
	printf ("Данная ветка не определена P=%d\n", P);
	#endif	
	printf ("------------------------------------\n");
	if    (P == 1) { 
	printf ("Выполняется ветка 1 P=%d\n", P);
}     
	else if  (P == 2)
	{ 
	printf ("Выполняется ветка 2 P=%d\n", P);
}
	else 
	{
	printf ("Данная ветка не определена P=%d\n", P);
}
		
}

На выходе вот так:
Выполняется ветка 2 P=2
------------------------------------
Выполняется ветка 2 P=2

В прикреплённых файлах бинарник, на линухе работает на винде не проверял.  :)

Slabovik

Я не особый знаток языка Цэ, но по моему скромному мнению, здесь разница заключается в том, что знак "#" означает, что следующее за ним является макрокомандой компилятору, а не командой непосредственно программы. Это используется для так называемой условной компиляции кусков кода, что в некоторых случаях удобно (например, при написании кроссплатформенной программы).

Код проверки
#include <stdio.h>
#define P 2
int main()
{
	#if    P == 1
	printf ("Выполняется ветка 1 P=%d\n", P);     
	#elif  P == 2
	printf ("Выполняется ветка 2 P=%d\n", P);
	#else  
для выявления разницы получился неудачный по той причине, что P является константой и при компиляции в программу "укладывается" именно тот printf, который соответствует этому P, при этом другие printf в программе вовсе отсутствуют. В итоге получается видимость правильного исполнения программы (видимость - это с точки зрения пользователя, т.к. пользователь подразумевает другой функционал. С точки зрения компилятора всё работает совершенно правильно).

Вот здесь (https://docs.mql4.com/ru/basis/preprosessor/conditional_compilation) немного суховато, но подробнее раскрывается суть условной компиляции.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

Nikopol


Slabovik

Бродил по интернету, наткнулся на интересный приём. Просто оставлю ссылку - вдруг пригодится кому

Как подключить содержимое любых файлов для использования в коде C / C++ (https://habr.com/ru/post/545946/)

Как раз интересно в плане засовывания в микроконтроллеры какие-либо бинарные данные без их конвертации в hex.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

Slabovik

Сишные нюансики: https://habr.com/ru/articles/847996/ (https://habr.com/ru/articles/847996/)
Кстати, некоторые весьма полезны.
Впрочем, не прибавляют любви к минимализации текста. Ну вот это, например
while (n --> 0) {
    printf("%d\n", n);
}
Фу, мерзость...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.