LINUX.ORG.RU

Помогите начинающему в C


0

0

Написал вот такую программу,но не нравиться компилятору конструкция if c "\!\!",что по книге Кернигана означает "или".

#define EOF 0
main ()
    {
	int c;
	while (( c = getchar ()) != EOF )
	{
	if ( c == ' ' \!\! c == '\n' \!\! c == '\t')
	putchar ('\n');
	else
	    putchar ('#');
	}
}

[alex@localhost C]$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-asplinux-linux/3.2.2/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-asplinux-linux
Thread model: posix
gcc version 3.2.2 20030222 (ASPLinux 3.2.2-5asp)

В чём грабли?
Спасибо!
anonymous

Re:

Забей на K&R, пиши ||

Murr ★★
()

чего? может ||? И скобочки не забудь расставить, а то приоритеты операций можно забыть или перепутать

hooj ★★
()

Спасибо!Заработала :-)

2 hooj Если не сложно,то покажите плиз,как бы Вы это сделали?Пока ещё стиля нет,поэтому чтобы не переучиваться было бы неплохо понять как лучше,потому что ИМХО всё нормально %-).

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

ну и зачем "начинающему" советовать непортабельно писать #define EOF (-1)

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

и не нужно - это только выебон, подумай о тех кто будет читать твою программу, имелось в виду if((выражение)операция(выражение))

P.S. на будущее - man indent - полезно будет

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

Выебон - это два вызыва функции (пусть putchar - макрос, но важен принцип), когда можно и нужно обойтись одним. К тому же код получается короче и выразительнее.

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

> Выебон - это два вызыва функции ... когда можно и нужно обойтись одним.

Выебон - это писать на Сях, когда можно писать на Асм'е. Так что-ль?

Эти два вызова присутствуют только в коде. Реально срабатывает один. Что в том случае, что в том.

anonymous
()

Я смотрю тут нешуточная баталия развязалась по поводу моей программы,а если я сделаю вот так,с вызовом функции только один раз:
#define EOF 0
main ()
    {
	int c;
	while (( c = getchar ()) != EOF )
	{
	if ( c == ' ' || c == '\n' || c == '\t')
	    c = '\n';
	else
	    c = '#';
	putchar (c);
	}
}

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

> Эти два вызова присутствуют только в коде.

Тебе этого мало? К тому же код с if - громоздкий и некрасивый.

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

Вот в таком случае (присваивания) _стопудово_ нужно использовать условный оператор.

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

Я тоже хочу внести свой вариант :) 

main ()
    {
        int c;
        for (;( c = getchar ()) != EOF ; putchar(c))
	        c=(c == ' ' || c == '\n' || c == '\t')?'\n':'#';
}

Дарю :)
а ещё бы воспользовался ф-цией isspace (если не напрягает)

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

Ну, радотоспособность этого кода ещё от компилятора зависит.

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

> К тому же код с if - громоздкий и некрасивый.

Естественно. Самый красивый код - где всё кратко, без лишних слов - одни знаки препинания. Лучше всего с эстетической точки зрения выглядят скобки не менее 20-го уровня вложенности, если они на одной строке. :))

На самом деле - в данном конкретном случае, можно было б и с условным оператором в аргументе написать - всё, в принципе, читабельно. Но... человек только начинает программировать. Причём на C. Не стоит портить ему дальнейшую жизнь.

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

А я помню нам в школе надо было на Паскале посчитать значение выражения u = _ ____________________________________________________ \ /3 + _ ___________________________________________ \/ \ /6 + _ _________________________________ \/ \ /9 \/ .... _ ____________ \ /99 \/ Я пошел с конца, т.е. считаю член прогрессии начиная с 33-го, и пихаю в переменную res := srt (res + a), при этом начальное значение res = 0, а а-это член прогрессии. А один баклан посчитал так: u := sqrt (3+sqrt(6+sqrt(9+sqrt(12+sqrt(15 и т.д. Самая тема была когда этот недоумок в конце поставил не 33, а 32 скобки, и получил syntax error :) Это я на тему уровней вложенности.

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