LINUX.ORG.RU

ansi c с чего начать

 ,


0

1

Есть мечта продвинуться в изучении C. У меня есть 3-е издание K&R, на русском. Первые главы я в принципе проходил, упражнения делал. Но наверное нужна ещё среда, в виде какой то IDE и компилятора. Я в принципе планирую использовать VIM+GCC. Вим я худо-бедно применяю. Но в K&R материал даётся без привязки к конкретной среде. Похоже что там не будет принципов работы Makefile, скриптов конфигурации, принципов сборки программы. По этому, периодически я поглядываю на другие учебники. Из того что наметил себе к прочтению - Крупник, «Изучаем С» и вот такой вариант: https://youngcoder.ru/map.php В книге Крупника упоминается среда Борланд, для варианта по ссылке выше можно поставить Pelles C IDE. Связываться с Pelles C IDE можно, из уважения к составителю курса, я себе поставил. Крупника наверное можно читать в отрыве от Борланд))) Хотелось бы услышать ваши советы - что почитать, на какие, может быть платные/бесплатные курсы пойти. Какое хорошее пособие вы можете посоветовать. Лучше может быть даже и на английском полностью языке. Куда можно будет устроиться, если удастся чему то научиться. Я бы в принципе подумал о втором образовании. Программирование меня увлекает. Немного есть положительного опыта с автолисп, наверное я человек не совсем бесталанный. Рядом со мной есть пример перехода из строительной области в бигдата. Но наверное C не очень хороший и возможный вариант в качестве второго образования. Какие бывают дипломы в этой области, что бы быть трудоустройенным? Извините за столь пространную формулировку, мне, в первую очередь, интересно хорошее онлайн-пособие с привязкой к UNIX, POSIX и современной практике. Если просто почитывать, потыкивать время от времени - я никуда не сдвинусь. Если пойти на платные курсы, шансов сдвинуться с мёртвой точки больше, может быть и поняв что я это не потяну ни при каких обстоятельствах. Спасибо.

★★★
Ответ на: комментарий от pihter

Конечно изменился. C99/11/17 внесли много хороших фич, которых во время K&R не существовало. И даже если бы язык не изменялся, его использование изменилось кардинально (после того как везде начали находить дыры в безопасности).

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

Присваивание легко спутать со сравнением. (= и ==)

У каждого сишника это уже в ДНК впечаталось, ибо выстрадано. Никто не перепутает. К тому же, gcc-шка-то ругается, если такое присвоение скобочками не обособить, мол, ты точно это имел в виду?

В этом нет проблем, если язык позволяет определять переменную в if/while, как C++:

вкусовщина же. Вон, в этих ваших современных модных языках и функции-то внутри выражения создают, не то что присваивания делают, и ниче – считается прогрессивным

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

Конечно изменился. C99/11/17 внесли много хороших фич, которых во время K&R не существовало. И даже если бы язык не изменялся, его использование изменилось кардинально (после того как везде начали находить дыры в безопасности).

ну это все уже про более высокие материи. Если человек вообще языка не знает – то ему фиолетово до современных практик и стандартов. А научиться писать на си можно по любому учебнику, имхо.

Мне, конечно, сложно судить, ибо я кроме K&R учебников по си не читал, наверное, судить можно если прочитать много и потому сказать какой лучший, но нафига читать учебник по си если ты уже умеешь писать на си? )

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

там функция main без типа возвращаемого значения

А я полюбляю спрашивать скомпилируется ли

int foo()
{
   return;
}

, и если да - что вернётся.

строчки копируются так

медленно, но работает же ;)

присваивания внутри if/while типа

А здесь то чего криминального? Я бы ещё и переменную там же определил дабы ограничить область видимости (если возможно). Но это правда к C времён K&R мало имеет отношения.

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

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

K&R не очень хорошая книга для изучения Си в наше время

Так Си ж не изменился.

Да ладно. До сих пор локальные переменные в начале функции объявляем?

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

Местный эмигрант в Швецию свободно рассказывает, как он писал ПО для МО РФ в России, потом беспрепятственно переехал в Швецию и там продолждал писать, снимая видеодоказательство в процессе.

Правильно ли я понял

Нет, ты неправильно понял. Лично мне посрать на государственные секреты, не интересуюсь.

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

Так Си ж не изменился.

Да ладно. До сих пор локальные переменные в начале функции объявляем?

а что, во времена K&R переменные надо было обязательно объявлять в начале функции?

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

Старый стандарт вроде так хотел. По крайней мере, компилятор выдает варнинги, если переменную объявить где-то в глубине реализации функции.

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

hibou ★★★★★
()
Последнее исправление: hibou (всего исправлений: 1)
Ответ на: комментарий от hibou

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

Ни разу не помню… это к main тоже относится? -Wall достаточно чтоб увидеть?

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

Не увидел ничего плохого, я тоже так пишу. А int main сейчас даже дети знают.

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

я посмотрю на ваш линупс когда торвальдс отойдет от дел, грустное у него будущее

А чейта только на линукс? Смотри еще и на винду и на БСД и на макось: ровно в день выхода Торвальдса на пенсию, все стразу откажутся от ядер, написанных на си, как пить дать

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

когда торвальдс отойдет от дел, грустное у него будущее

В том, что останется к тому времени от IBM.

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

До определённых пределов, заданных в том числе биологическими ограничениями.

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

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

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

во времена K&R переменные надо было обязательно объявлять в начале функции?

Не в начале функции, а в начале блока, если они не объявлены в объемлющей области видимости.

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

Это разница в воспитании, с одними занимались родители и репетиторы, а других просто предоставили самим себе. А не потому что у них это прописано в ДНК. Разумеется, какая-то разница между людьми есть, но тренировки значат гораздо больше.

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

Потому что первого с детства натаскивают на это, этому предшествуют года обучения и построения базы.

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

А не потому что у них это прописано в ДНК

А умных/глупых от природы тоже не бывает? Просто воспитание?

Разумеется, какая-то разница между людьми есть, но тренировки значат гораздо больше

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

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

медленно, но работает же

strcpy (memcpy) точно так же работает, а тут называют имплементацию glibc чем-то плохим. Ну такое :)

что вернется

Что может вернуться, если ты объявил возврат int и не вернул int? Ошибка компиляции.

untitl3d
()
Последнее исправление: untitl3d (всего исправлений: 1)
Ответ на: комментарий от Im_not_a_robot

А не потому что у них это прописано в ДНК. Разумеется, какая-то разница между людьми есть, но тренировки значат гораздо больше.

Это аналог разницы между мясными и молочными породами КРС. «Мясные» бычки в качалку не ходят, а мышечную массу прибавляют стабильно, только корми!

А если встроенная ДНК подкачает, то биохимики всегда готовы помочь.

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

глупых от природы тоже не бывает?

Глупость от природы бывает, например, и приобретённая в ходе онтогенеза.

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

Во, вот так сработало:

tim@timdeb:/mnt/d1/code/std-test$ gcc std.c -o std -Werror=declaration-after-statement -std=c89
std.c: In function ‘main’:
std.c:7:3: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
   int b = 20;
   ^~~
cc1: some warnings being treated as errors

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

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

Да ну, чтобы собрать его просто хэлловорд и понять, как компилятор это делает, достаточно консоли и gcc. А уже потом можно и магию практиковать.

Например, как объяснить новичку, который изучает Си, в том числе путем вникания в чужой код, зачем нужна опция компилятора -fPIE и почему без нее (иногда наоборот с ним) вроде бы корректная программа может сегфолтиться?

Оно ему точно нужно для хелло-ворда или сортировки пузырьком? И как ему в этом поможет IDE? Именно в понимании? Просто подставит там, где надо?

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

См., напр., https://minnie.tuhs.org/cgi-bin/utree.pl?file=V3/c/c02.c

В этой версии ещё различаются полноценные блоки и составные операторы, в которых не может быть объявлений:

statement(d) {
/*объявления*/
	switch(o=symbol()) {
/*.....*/
	/* { */
	case 2: {
		if(d)
			blkhed();
		while (!eof) {
			if ((o=symbol())==3)	/* } */
				goto bend;
			peeksym = o;
			statement(0);
		}
		error("Missing '}'");
	bend:
		return;
	}
/*.....*/
        } 
/*.....*/

}

Если здесь и в аналогичных местах заменить statement(0) на statement(1), то blkhed() будет парсить список объявлений в начале каждого блока.

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

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

Кто их там отбирает? Это всегда желание родителей. Озаботились родители воспитанием и хорошей школой – ребенок растет «умным», не озаботились – «тупым».

А умных/глупых от природы тоже не бывает?

Бывают, конечно, но это все необычные случаи. В среднем все более-менее одинаковые.

Im_not_a_robot ★★★★★
()
Последнее исправление: Im_not_a_robot (всего исправлений: 1)
Ответ на: комментарий от anonymous

С мышцами реально проще, чем с мозгом. Работа мышц в целом уже известна. А вот физическое обоснование сознательной деятельности пока что еще не открыто. Есть некоторые намеки, вроде числа синапсов. Это число в свое очередь определяет число максимально возможных связей, что ведет за собой разветвленность и развитость нейросети. Но опять же… это все пока не четко.

Кроме того, у мозга огромные возможности по адаптации. Известен случай нормальной жизни с одним полушарием например. Да и без таких экстремальных случаев, вполне обычных тоже полно.

Глухие дети например. Развитие глухих идет не так, как слышащих. Есть отличия. Примерно подсчитано, что нагрузка на зрительные области мозга глухих людей приблизительно в 5 раз выше, чем у слышащих. Так понятно, что если человек с детства учился распознавать и взаимодействовать с миром через зрение, то понятно, что в мозге очень большие области отведены под это дело. Т.е. мозг адаптируется и перераспределяет мощности.

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

Это бессмысленннее, чем ядро.

Хорошо. И какая должна быть первая программа в контексте «я ваще не знаю языка»?

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

Если цель – заняться нецеленоправленной деятельностью, то логично начать с чего-нибудь вроде

cc -c -x c /dev/null

У ТС же есть невыдуманные задачи из инженерной практики. Зачем ему специально придумывать учебные упражнения?

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

слух при желании можно развить

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

У ТС же есть невыдуманные задачи из инженерной практики. Зачем ему специально придумывать учебные упражнения?

Ну вот не знаешь ты язык вообще. Ни разу не писал. И что, так прям сразу пошел писать реальные задачи? Особенно если не имеешь вообще опыта в погромистике (если я правильно понял ТСа).

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

Я согласен с тем, что программирование должно быть дано (навроде как музыкальный слух), но, блин, если этот дар книгами не обмазать – грош цена такому дару

Удваиваю.

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

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

Не совсем наш случай:

Первые главы я в принципе проходил, упражнения делал.

Программирование меня увлекает. Немного есть положительного опыта с автолисп, наверное я человек не совсем бесталанный.

vM ★★
()

Вставлю 5 копеек.

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

Чтобы gcc не тупил над стандартом из этой книги, надо юзать ключ -ansi

cc -ansi bla-bla.c

тогда всё пучком.

Не знаю как там для профи, но для линуксоида энтузиаста книжка просто супер, а чего не понятно в упражнениях (не понял ТЗ), то всё, абсолютно каждый чих, гуглится на раз.

Если человек на «вы» с Unix, то, к сожалению, авторы ничего такого не разжёвывают (и слава богу), так что челу придётся где-то узнать об основах работы в командной строке. Например, со всеми этими (c = getchar()) использовать ./a.out < bla-bla.txt и всякое другое по мелочи.

papin-aziat ★★★★★
()
Ответ на: комментарий от pihter

Ну для memcpy есть миллион способов, а в ядре linux, емнип, аж код который их тестирует при загрузке и выбирает самый быстрый. Навскидку, цикл можно за’unroll’ить, копировать через регистры по 2-4-8 байт, потом через simd, при желании вообще многопоточно, с форсированным prefetch’ем страниц, это только то что вспомнилось.

strcpy сложнее ускорить потому что длина неизвестна, а читать за терминирующим нулём нельзя. Но можно извернуться - «нельзя» на самом деле только если чтение пересекает границу страницы, поэтому внутри страницы можно, прерываясь если встретился 0, и часть подходов memcpy применима.

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

Ну вот не знаешь ты язык вообще. Ни разу не писал. И что, так прям сразу пошел писать реальные задачи? Особенно если не имеешь вообще опыта в погромистике (если я правильно понял ТСа).

Про «не имея вообще опыта» не скажу, в противном случае конечно же да. А что тебя может остановить? Если ты не знаешь чем if от else отличается то да, видимо надо порешать какие-то упражнения. А иначе зачем тратить время - берешь и решаешь реальную задачу с куда большей отдачей.

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

Мне кажется, здесь можно привести аналогию с человеческими языками общения. Предположим, вы знаете один язык из одной языковой группы и собрались выучить другой язык из совсем другой языковой семьи. Например, зная русский звучащий язык, собрались изучить, скажем, русский жестовый язык (РЖЯ).

Конечно можно исходить из реальных задач. Реальная задача, надо сказать что-то глухому человеку на РЖЯ. Берете учите нужные жесты и вуаля. Вы уже говорите.

Одно тут но. Вы не понимаете, что вы говорите и почему оно именно так. Потому что реальная задача не заставила вас выучить теорию. Потому что к реальной задаче не прилагалась программа обучения. Поэтому вы не знаете, например, что в РЖЯ другой порядок слов, не такой как в русском звучащем языке. Не знаете исторического происхождения многих жестов. Например связь между жестами «обед» и «12». Не знаете что конфигурация рук не взята из воздуха а тоже подчинена правилам – в ее основе дактильный алфавит и счет.

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

Хорошо ли это? Наверное нет.

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

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

При этом, зная систему, можно изобретать новое. И есть большая вероятность, что будете поняты.

В рамках системы вполне можно показать характер предметов и действий. Это называется вариативность жестов. Она вполне допускается. И даже придумать новые жесты. Может быть вас даже поддержат.

Но все это в рамках системы. А ее нужно еще усвоить.

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

Большинсто человеческих языков общения не спроектированы.

А Си придумывался и дописывался в ходе его эксплуатации в конкретных условиях. Не на пустом месте, конечно.

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

И тем не менее законы есть. Языки сложились эволюционно. Надо понять законы и все будет нормально.

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