LINUX.ORG.RU

Switch - помогите осилить в C

 , , вкурить,


0

4

Читаю книгу по C. Дошел до Switch. А тут в книге такой говянный пример приведен по работе с данным циклом, что просто пипец.

Лор, пожалуйста приведите простой пример использования switch.

P.S если правильно понял, то при введеном значении, это значение прогоняется по всему листу switch case: и как только оно совпадает, то происходит действие вложенное в case n:


Ответ на: комментарий от nei8Adai
второе условие
goto два
третье условие
goto три

неправильно. На самом деле там строится таблица переходов, и вместо проверки «условие 1, 2, 3...» просто тупо выполняется переход на нужную метку. А так, как вы тут написали, switch работает в bash'е и в php.

drBatty ★★
()
Ответ на: комментарий от aedeph_

А то, что ты написал действительно невнятная каша.

так по дефолту разворачивает switch тот же gcc, без включенной оптимизации ес-но

wota ★★
()
Ответ на: комментарий от drBatty

brain fucker'ы.

То есть ты даже схему пытался, но не осилил? Может лучше улицы пойдешь подметать или на завод устроишься?

aedeph_ ★★
()
Ответ на: комментарий от drBatty

а вот это можно накатать на python'е, или там даже на пхп

да

Я как понял, под «нормальными» понимались всякие лиспы, и прочие brain fucker'ы.

если так - то согласен с вами

wota ★★
()
Ответ на: пост создался с целью узнать от tiile

Если есть какой-то отличный пример - то в студию.

вообще-то, switch в C можно смоделировать массивом указателей на функции. Т.е. пишется много-много функций, и создаётся массив, который и инициализируется указателями на эти функции. А потом просто запускаем нужную типа array[index](paraetrs), ну как-то так, такое редко нужно.

ну вам пока это рановато...

drBatty ★★
()
Ответ на: комментарий от aedeph_

Нет, не так же.

да - не совсем так, но близко:

~$ cat 1.c
int main()
{
	int n = 1;

	switch( n )
	{
		case 0: n = 0; break;
		case 1: n = 1; break;
		case 2: n = 2; break;
		case 3: n = 3; break;

		default:
			break;
	}
}
~$ gcc -S 1.c
~$ cat 1.s
	.file	"1.c"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$1, -4(%rbp)
	movl	-4(%rbp), %eax
	cmpl	$1, %eax
	je	.L4
	cmpl	$1, %eax
	jg	.L7
	testl	%eax, %eax
	je	.L3
	jmp	.L2
.L7:
	cmpl	$2, %eax
	je	.L5
	cmpl	$3, %eax
	je	.L6
	jmp	.L2
.L3:
	movl	$0, -4(%rbp)
	jmp	.L9
.L4:
	movl	$1, -4(%rbp)
	jmp	.L9
.L5:
	movl	$2, -4(%rbp)
	jmp	.L9
.L6:
	movl	$3, -4(%rbp)
	jmp	.L9
.L2:
	nop
.L9:
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.7.0-12ubuntu1) 4.7.0"
	.section	.note.GNU-stack,"",@progbits
wota ★★
()
Ответ на: комментарий от drBatty

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

anonymous
()
Ответ на: комментарий от wota

так по дефолту разворачивает switch тот же gcc, без включенной оптимизации ес-но

кто же без оптимизации компиллит?

drBatty ★★
()
Ответ на: комментарий от aedeph_

То есть ты даже схему пытался, но не осилил?

даже и не пытался.

Может лучше улицы пойдешь подметать или на завод устроишься?

вот когда все вакансии будут для лисперов, а Сшники будут никому не нужны, пойду подметать. А пока как раз лисперы подметают.

drBatty ★★
()
Ответ на: Разве от tiile

А что значит «понимать, что лежит в основе используемых интсрументов»?
Вот мне надо спилить дерево - я беру бензопилу и делаю это. Качество зависит от того, как именно я пилю, и в какую сторону дерево упадет. Сам факт того из чего состоит данный инструмент, его конструкция и прочее не влияет на качество.

ты должен знать, что у бензопилы от не того сорта древесины может слететь цепь, что после определенного числа проделанной работы её необходимо дозаправить и смазать, что курить во время работы бензопилой не следует и, самое главное, ты должен убедиться, что это дерево, а не спичка или деревянная ложка
примерно в этом и состоит понимание основ

kostett ★★★
()
Ответ на: комментарий от anonymous

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

сомневаюсь, что он синтаксически грамотно сможет записать массив указателей на функцию :-) Это же не пхп - программа просто не соберётся.

drBatty ★★
()
Ответ на: комментарий от drBatty

даже и не пытался.

Тогда твоё мнение в данном вопросе не является хоть сколько бы то ни было компетентным и его невозможно не игнорировать.

А пока как раз лисперы подметают.

Маловероятно.

aedeph_ ★★
()
Ответ на: комментарий от drBatty

Я изучал Си по другой литературе в свое время, даже не знал, что есть эта книга. Когда попал на ЛОР удивился всеобщей восторженности от нее, заглянул, но ничего неоридинарного там не нашел.

(Для синтаксиса языка - там слишком много воды, для учебника по алгоритмов или библиотекам - слишком мало материала).

Что же в ней такого, объясните!

anonymous
()
Ответ на: комментарий от note173

Даже Pascal не видел...

И это очень хорошо.

+1

anonymous
()
Ответ на: комментарий от drBatty

тогда уместнее ссылка на Кнута. А не на этот ваш лишп.

Заруби себе на носу, дружок: SICP — УЧЕБНИК ПО ПРОГРАММИРОВАНИЮ, а не книга по схеме. На чем выполнять задание - твое дело. Хоть на JavaScript-e (В интернете видел решения на C++/Scala/Ruby/Python/Clojure/Haskell). Прочитать Кнута топикстартеру тоже не помешает, но там материал не для его уровня.

anonymous
()
Ответ на: комментарий от dave

В С О(N) работает быстрее, чем O(1) в нормальных языках.

Развеселил, молодец!

В Си O-О-О от Эн работает быстрее, глубже. Это реальная жизнь без ретуши, Потому, что в си не всегда доживают даже до 25. Поэтому–то чернокожим подросткам так трудно избавиться от привычек своей юности.

anonymous
()
Ответ на: комментарий от aedeph_

Тогда твоё мнение в данном вопросе не является хоть сколько бы то ни было компетентным и его невозможно не игнорировать.

как хочешь. И тем не менее, часто O(N) действительно быстрее O(1), хотя математикам и теоретикам понять это не под силу. Вот Кнут об этом много писал, и примеры там на простом как 3 копейки ассемблере, а не на какой-то непонятной НЁХ.

Маловероятно.

да, лисперы _учат_ других кодеров как писать программы. Некоторые за хорошие деньги, некоторые забесплатно на ЛОРе. А другие кодеры эти программы _пишут_. Вот и вся разница.

drBatty ★★
()
Ответ на: комментарий от anonymous

Что же в ней такого, объясните!

это первоисточник от разработчиков ЯП. Остальное == рабинович напел. Не, я не отрицаю, за эти годы было написано Over9000 годных книжек, но...

(Для синтаксиса языка - там слишком много воды, для учебника по алгоритмов или библиотекам - слишком мало материала).

ИМХО синтаксис раскрыт полностью, и читать описание синтаксиса «без воды» ИМХО очень трудно. Да и не нужно, только если вы не собираетесь делать новый компилятор. А про алгоритмы - да, тема не раскрыта. Впрочем, сами авторы об этом честно признаются.

drBatty ★★
()
Ответ на: комментарий от anonymous

O_o

Я не хочу! Скажите, что они не верно делают?

/* я конечно-же адекватно оцениваю информацию с Лора. Так, что наврядли стану в ноги себе стрелять. */

tiile
() автор топика
Ответ на: комментарий от anonymous

Заруби себе на носу, дружок: SICP — УЧЕБНИК ПО ПРОГРАММИРОВАНИЮ, а не книга по схеме.

оно учебник по теории программирования, а не по практике. Практика там исключительно по лиспу, и ТСу будет только мешаться.

Прочитать Кнута топикстартеру тоже не помешает, но там материал не для его уровня.

да ладно, не так это и сложно на самом деле. За одно и знания в матане получит/освежит. Математика всяко полезнее ваших нелепых скобочек и смайликов.

drBatty ★★
()
Ответ на: комментарий от drBatty

SICP
оно учебник по теории программирования, а не по практике.

Нет, SICP - это именно практика. ЕЩЕ РАЗ, на чем ты там пишешь - неважно. Вон, сейчас вроде на питоне пишут.

anonymous
()
Ответ на: O_o от tiile

Я не хочу! Скажите, что они не верно делают?

всё у меня верно, просто это ещё для вас очень сложно. Вам надо постигнуть тайное знание массивов в С, потом усвоить, что никаких массивов нет, потом узнать дао указателей, потом научится _свободно_ понимать такие понятия как «указатель на указатель», и чем оно отличается от скажем массива указателей, ну а потом дойдём и до массивов указателей на функции. Короче путь длинный предстоит. Пока юзайте switch/case...

/* я конечно-же адекватно оцениваю информацию с Лора. Так, что наврядли стану в ноги себе стрелять. */

станете. Как пить дать. Все стреляют, и вы будете. И ЛОР тут не причём, в C и так полно разнообразной и очень весёлой НЁХ.

drBatty ★★
()
Ответ на: комментарий от anonymous

Нет, SICP - это именно практика. ЕЩЕ РАЗ, на чем ты там пишешь - неважно.

ну давай схему на С том же... А то, как ты наверное понял, от этих ваших академических ЯП меня тошнит.

drBatty ★★
()
Ответ на: я не догоняю от tiile
switch(param)
{
case 1:
do something
break;

case 2:
do something
break;

case 10 ... 99:
do something
break;

case 100:
do something
break;
}

ферштейн?

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от drBatty

Я старался проще написать... Сейчас понял, что «условие» — плохое слово, ну да ладно.

nei8Adai
()
Ответ на: комментарий от nei8Adai

gcc может делать switch и так, и так

ес-но

Это зависит, например, от количества ветвей.

логично

wota ★★
()

странно, что поциенту не предложили уже классический пример:

void send(register* to, register* from, register count)
          // Псевдоустройство. Все комментарии сознательно удалены
          {
             register n=(count+7)/8;
             switch (count%8) {
                case 0:  do {  *to++ = *from++;
                case 7:        *to++ = *from++;
                case 6:        *to++ = *from++;
                case 5:        *to++ = *from++;
                case 4:        *to++ = *from++;
                case 3:        *to++ = *from++;
                case 2:        *to++ = *from++;
                case 1:        *to++ = *from++;
                             } while (--n>0);
            }
          }
hizel ★★★★★
()
Ответ на: комментарий от nei8Adai

Это зависит, например, от количества ветвей.

ну и в большей мере это зависит от разреженности значений в case, если значения идут вразброс - будет использоваться обычный бинарный поиск, хоть с оптимизацией, хоть без

wota ★★
()
Ответ на: комментарий от anonymous

А в этих ваших «нормальных» языках Duff's device написать можно? Нельзя? В сад!

anonymous
()
Ответ на: Эмм пока даже не читал о таком от tiile
switch (symbol) {
    case '0'..'9':
        printf("This is a number\n");
        break; /* Выходим из switch, дальнейшие сравнения не производятся */
    case ' ':
    case '\t':
        printf("This is space or tabulation\n"); /* Это выведется, если symbol - либо пробел,
                                                                    либо знак табуляции */
    default:
        printf("Unknown charachter\n"); /* Этот код выполняется, даже если symbol - либо
                                                             пробел, либо знак табуляции: ведь мы не
                                                             предприняли ничего, чтобы выйти из switch, для
                                                             этого используются операторы return и break. */
        break;
}

А вообще, выбрось свою книгу: она негодная. Читай K&R.

HerrWeigel ★★★★
()
Ответ на: комментарий от HerrWeigel

Бывает, но я не думаю, что это хороший стиль программирования, потому что case действует не как проверка условия и бывает сложно отследить исполнение программы (особенно когда глаза замылены уже).

ms-dos32
()
Ответ на: комментарий от drBatty

можно, но жалко. У пистона и так половина сторонних модулей на C из-за тормознутости самого языка, и чем дальше, тем хуже.

anonymous
()

P.S если правильно понял, то при введеном значении, это значение прогоняется по всему листу switch case: и как только оно совпадает, то происходит действие вложенное в case n:

Почти так. Происходит действие ОТ метки case n: до конца свитча, либо до встреченного оператора break (ну, или return там). То есть, если break-ов нет, а первый вариант подходит, то выполнятся все остальные 100500.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.