Есть ли книжка, или какой другой ресурс, в которой описывается СИ максимально подробно?
Доброго времени!
Очень хочу разобраться как работает все на уровне команд процессора, памяти, при работе с языком Си. Я знаю некоторые вещи, но от собеседования к собеседованию понимаю, что моего незнания больше чем знания. /
Я изучал K&R, дважды прочитав и проработав материалы. Изучал различные курсы по программированию на Си, сайты, работу программы через дебаг, map файл итп. Постоянно встречается какая нибудь тонкость, которую я либо плохо понимаю, либо не знаю.
Подскажите, как бы искоренить собственное невежество по отношению к Си и повысить собственный профессионализм?
Дмитрий: Да, это понятно. А где можно было бы по подробнее почитать о том, как именно это делает компилятор? хотя бы на примере gcc. Возможно книга "Полное руководство GCC" имеет ответы на вопросы типа "как поведет себя компилятор в такой то ситуации...?" Быть может вы знаете какие то интересные источники по поведению компилятора?
Я помню, еще в книгах читаешь (не важно какую), бывает пишут, что - то типа "если эта переменная нигде не используется, то компилятор оптимизирует ее... бла бла бла". Было бы здорово изучить чей нибудь труд по поведению компилятора.
А теперь объясните, почему в первом случае выдает 0 и не выдает ошибку? Я правильно понимаю, что мы создаем массив из 3 символов, присваиваем ему множество 1, 2, 3 и просим вывести 4-й символ массива? Я просто новичок в Си
Написано только что
WorldEn: не выдается ошибка потому что при обращении к ячейки памяти не происходит проверки на выход за границы массива. И если у нас есть доступ к этой памяти (а в данном случае, мы просто обращаемся к следующей ячейки памяти стека main()) то нам ничего не мешает распечатать значение этой ячейки.
в общем виде, там может быть что угодно. Так же, там могли бы быть аргументы функции printf. Это зависит от компилятора.
На уровне процессора все работает не на Си, а на машинных кодах, на ассемблере, поэтому если вы хотите нюансы - изучаете ассемблер, а затем изучаете работу компилятора Си, чтобы смотреть как и во что он компилирует ваш код.
В зависимости от версии компилятора, от платформы, от опций оптимизации компилятора, результат может быть разный.
Да, видимо нужно изучать не механизмы самого Си, а как работает ассемблер. Это знание даст возможность читать скомпилированный код и анализировать что куда девается и как работает. Спасибо, хороший совет.
Подскажете как войти в тему ассемблера наиболее безболезненно?
pixik: никак. IT - область с высоким порогом входа, без боли не будет. Особенно сейчас, когда полностью ассемблер знают наверное только инженеры интела и амд.
Попробуйте почитать простые туториалы об основах ассемблера.
Почитайте вкратце про архитектуру .exe файлов, чтобы понимать как они разворачиваются в памяти.
И напишите парочку программ на современном masm, чтобы хотя бы начало запускаться.
Затем просто пробуйте дебажить - должно хватить.
ПисАть. ПисАть и еще раз писАть. Изучать чужой код и писать свой. Если не хочется "задачу ради задачи" - присоединиться к какому-нибудь сообществу и попытаться им помочь.