LINUX.ORG.RU

Как читать и понимать С/C++ код?

 ,


0

6

На ютубчике недавно появился ролик с сабжевым названием.

https://www.youtube.com/watch?v=5P5TmcGj9Mk

И после его посмотра у меня возник один вопрос. Вопрос не праздный, потому что я сейчас хочу выкинуть на свалку мои единоличные двадцатилетние бодания с языком C++. Я хочу отказаться от плюсов и забыть их как страшный сон. Матерые плюсисты мне говорят: ты тупой, ты не наш, ты позоришь светлое имя языка C++. Если ты за такое время не смог осилить язык, зачем ты мучаешься? В твоей тупости виноват только ты и твои родители, но не язык. Ты неспособен обучаться, смирись с этим и иди работать таксистом (я уже почти готов).

Так вот, вопрос в следующем. Человек в ролике показывает чудеса парсинга замороченного синтаксиса, он прямо ходячий бионический синтаксическо-лексический анализатор. Но у меня сложилось впечатление, что он это делает механически, совершенно не представляя в голове ту структуру, о которой говорит:

unsigned short *(*(**bazz[][7])())[];

Скажите мне, великие сплюсовики, вы действительно можете представить себе в голове структуру этого выражения, как она размещается в памяти, и что на что указывает? Или, когда ее разбираете, просто произносите слова? Мне это очень интересно, а узнать не у кого, и эту тонкость автор ролика опускает, вскользь говоря что пример академический. Когда меня такое спрашивают на собеседованиях, я честно пытаюсь представить в голове всю структуру, и чувствую, что торможу на третьем уровне «который...», после чего мое понимание заканчивается. Я могу оттараторить с грехом пополам парсинг "по спирали", но у меня понимания структуры не будет, это какой-то непредставляемый монстр. Неужели представление есть у автора ролика?

★★★★★

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

Так нужно ли сразу представлять, все равно нужно создавать массив сначала, заполнять его, и так можно вниз до основного типа спуститься!

vladimir_vist
()

Выёживания, не парься. Нормальному человеку больше ** не надо.

ilovewindows ★★★★★
()

У тебя проблема другая. Ты очень наивный.

Давай разберём выражение, которое ты привёл. У него несколько уровней:

1. youtube.com - если ты смотришь какие-нибудь обучающие материалы никогда не забывай про

Кто умеет, делает; кто не умеет, учит других. — Джордж Бернард Шоу

2. И после его посмотра... - тут мы переходим к мотивации утубщиков. Дело втом, что в топы там попадают за лайки, дизлайки и комментарии (надеюсь ты не комментировал?).

Если видос хороший, то обычно мало кто отписывается или лайкает (поэтому все ютубщики всё время клянчут и то и другое).

А вот когда бамболео, то наоборот. Видос зашёл.

Т.о. идеальное видео на ютубе не несёт никакой полезной информации, зато содержит грубые ошибки, явные подтасовки и т.д. Всё ради активности.

Хорошо хоть говно (натуральное) банят. А то все топы были бы заполнены говном (натуральным) всех сортов. Шок контент и всё такое.

------------

В итоге тебе нужно выкинуть привычку доверять ютубу. По крайней мере пока он не перестанет мотивировать нечистых на руку товарищей.

А такие шаманские конструкции в жизни никто не использует, ибо могут в бубен постучать. Обычно всё сводится к указателю на что-то (что тоже может быть указателем). Всё равно арифметика работает только с верхним уровнем указателей.

anonymous
()

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

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

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

Дело втом, что в топы там попадают за лайки, дизлайки и комментарии (надеюсь ты не комментировал?).

Тока надо чтобы дизлайков было чуть поменьше, чем лайков

annulen ★★★★★
()

Ролик посмотрел, всё, что там рассказано, вроде знаю (но бОльшая часть вещей упоминаются вообще непонятно зачем, видимо, для пущей научности).

unsigned short *(*(**bazz[][7])())[];

Даже пытаться не буду такое понять. Если это собеседование - то уйду, наверное. Пусть студентов берут такое расшифровывать:)

В общем, что хочу сказать. Критиков не слушайте. Даже если вы что-то не сразу/медленно/с трудом понимаете в плюсах/Qt/QML и т.д., всё равно у вас получается гораздо лучше, чем у многих «знатоков». Вы умеете то, что не дано им - вы умеете взять и сделать вещь (программу). Например, MyTetra.

ЗЫ. За MyTetra вам большое спасибо, пользуюсь каждый день.

Beewek ★★
()
Последнее исправление: Beewek (всего исправлений: 1)

Это же обучающий пример по приоритетам. Чего у тебя седло горит?

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

За MyTetra вам большое спасибо, пользуюсь каждый день.

А в чём её прикол? Фишка так сказать? В двух словах. Все нахваливают, а я видать фишки не просёк.

Deleted
()

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

BceM_IIpuBeT ★★☆☆☆
()

Херне какой-то тебя учат. Выучи лучше Go, Swift, или Python, будешь писать высокие абстракции с ООП, а не байто@бством заниматься. Байты не всем нравятся, и возить с памятью низко уровневой тоже ничего хорошего, тебе мозги пудрят, что типа это важно и нужно. Запомни, где сложно, там легко ошибиться. Надо упрощать и на комп низкоуровневые задачи перекладывать. И да, C++ местами говно ещё то, не путать с Си :)

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

А в чём её прикол? Фишка так сказать?

Очень удобно. Есть структура заметок в виде дерева. У заметок есть теги, то есть, вторая иерархия. Это значит, что если заметка относится к двум-трём категориям, я её не потеряю.

Удобно вставлять куски текста из интернета. Чтобы не вспоминать мучительно: «где же я видел вот эту полезную вещь года два-три назад?», а знать точно - оно у меня занычено.

Можно к заметке приложить файл(ы). Теперь и pdf-ки у меня лежат в единой структуре данных. В общем, мне очень зашла эта программа.

Есть кое-какие замечания по пользовательскому интерфейсу, и я всё собираюсь что-нибудь исправить/доработать, но пока никак не соберусь. Стыдно.

Beewek ★★
()

unsigned short *(*(**bazz[][7])())[];

А при чём тут плюсы? Это чистый Си, если не ошибаюсь. И да, за такой код на код-ревью очень сильно бьют по рукам

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

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

То есть, по-вашему, моё описание говорит, что что MyTetra - это скрап (мусор?) с тегами? Я вроде другое описывал. Но с тегами, да.

Beewek ★★
()

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

Двумерный массив указателей на функции, которые возвращают массив типа short? Вроде, тут особо нечего то представлять, всё очевидно. Хотя, я мог неправильно распарсить выражение. В том же шарпе, где есть повсюду ссылки вместо указателей и скобки [] ставятся после типа, а не после выражения, - такие структуры выглядят очевиднее.

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

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

Beewek ★★
()

1. «Ты ухажу»

2. пример на ПОНИ-мани-е той главы из K&R(2изд) как же лепится парсер обьявлений в пюре C - как тут уже отметили эт С без всяких плюсов (которые возможно и скрыты за перегрузкой * [] ЕЖЕЛЬ базовый тип ushort «не то что ожидаемо»( т.е привлекать тут С++ и есть очень контр-продуктивная и ресурсотратная стратегия, полезная для своекорыстного менеджера заинтересованого в тупых исполнителях на которых можно списать перерасход бюджета)

3. и да на ютубе ща во все поля «осень usenet'ов » - публика падка на балаган с торжища.

3.1 при этом есть очень качественный контент с единицами тысяч просмотров на дистанции в года как то : ....

anonymous
()

Вопрос не праздный, потому что я сейчас хочу выкинуть на свалку мои единоличные двадцатилетние бодания с языком C++. Я хочу отказаться от плюсов и забыть их как страшный сон.

Ну дык. Добро пожаловать в клуб :). https://hh.ru/search/vacancy?text=Golang&area=1

hbee ★★★★
()
Последнее исправление: hbee (всего исправлений: 1)

Да, синтаксис обьявления указателей на функцию визально отличается от всех остальных. А при смешивании его с массивами вообще кровавое месиво.

Твой пример, он вообще чистая сишка. Нормальный человек бы просто разбил на типы (typedef для С, using для С++). Причем, забавно, что с using выглядит приятнее:

  using ArrOfPointers = unsigned short *[];
  using Function = ArrOfPointers* ();
  using ArrOfFunctions = Function**[][7];
  
  typedef unsigned short *ArrOfPointersT[];
  typedef ArrOfPointersT* FunctionT();
  typedef FunctionT** ArrOfFunctionsT[][7]; 

https://wandbox.org/permlink/jTivnAMax6MnamjQ

KennyMinigun ★★★★★
()

Оно же не скомпилируется без инициализатора :)

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

Оно же в памяти только до указателя на функцию, а дальше это уже отдельный тип. Да и представлять нет необходимости, по крайней мере не всё сразу (никто не мешает смотреть только на пару смежных уровней за раз).

xaizek ★★★★★
()

Не надо такое ни читать, ни писать. И уметь не надо. Ты опять нашел проблему где ее нет.

anonymous
()

ты тупой, ты не наш, ты позоришь светлое имя языка C++

this ---^

На самом деле - люди которые пишут на C++ профессионально, читай за деньги, используют некое подмножество языка. Для особенно изысканных случаев - можно выйти за рамки, и если ты знаком с идиомами(знаешь что могло бы быть в языке, а чего вряд ли) - вполне себе можно быстро добраться до сути.

Это не отменяет архаичности и повышенного уровня вхождения, однако, на данный момент нет соизмеримых вариантов насколько я знаю(как минимум в плане портабельности, ну например под os/400 - врят ли есть rustc, go, d или хотя бы python). Есть вещи которые можно лаконично <<---- и это важно, изобразить на плюсах, довольно чётко представляя, во что это выльется в асме, под конкретную платформу. После продолжительно коммерческой практики на голом C я могу это сказать с большей уверенностью, чем прежде.

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

Если говорить объективно(тут начинается имхо, как бы каламбурно это не звучало), конкретно про твои телодвижения, как они видны на лорчике и житхабе в моей перспективе - ты пытаешься использовать api, не вдаваясь ни в то, как оно устроенно(каким образом работает), ни в тонкости вызывающей стороны(язык программирования). Это вполне себе нормальный подход для того класса систем которые разрабатываются, и дело делается хорошее, но. Стек технологий выбран неверно.

Ибо языки уровня системного клея выбираются когда надо выжать n микро/наносекунд при необходимости, в узком месте, и имеется tradeof - иметь хоть какой то ООП или мега совместимый со всем что нынче понаписано abi. В остальных случаях, знающий внутреннее устройство предыдущих уровней абстракции человек(читай архитектор), выберет более подходящий стек технологий.

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

Есть rust, это светлое будущее

Мне кажется его постигнет участь D, когда движ будет?

vladimir_vist
()

Неужели представление есть у автора ролика?

Ролик предназначен для тех, кто не знает Си++ вообще. Использованная конструкция нужна только вызвать у зрителя благоговейный трепет. Видимо, удалось.

В качестве головоломок — подойдёт. Для использования в программах — не годится.

i-rinat ★★★★★
()
Ответ на: комментарий от menangen

go

высокие абстракции с ООП

Так и запишем, go в глаза не видел, но мнение имеет.

fluorite ★★★★★
()

Владимир

Дело не в C++.
Вот познакомьтесь с следующими суждениями.
Это шуточные суждения, но они не далеки от правды.

«Ага. Так же, как и нельзя игнорировать критерии утопического субъективизма в свзяи с ультрарадикальными взглядами на реально существующее :) Ну, это и понятно, поскольку ведь каждый индивидуум метафизически самосоставляет абстракцию :)»

Ну говоря в стиле а-я К.Маркса. «Индивидуум живет в отртодоксальной иллюзии восприятии заботы общественного строя об нем».

...

Это прямая аналогия приведенного вами кода на C++.

Также полезно сходить в шестую палату и послушать Наполеона, ...

Сказанное выше не для того, чтобы оскорбить вас.

PS: «C++ - это жизнь» /пародия на рекламу «АИФ - это жизнь»/.

anonymous
()

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

Ну окай... я далеко не холерик, я сразу же понял что этот мозговой спринт 🐱‍🏍 не для меня. 😂🤷‍♀️👀

Deleted
()

1. За использование таких конструкций надо гнать ссаными тряпками. Это не C++ и даже не C, это наркомания как она есть. Я работал в довольно сложном и низкоуровневом сишном проекте, но не представляю ситуации, когда подобный код прошел бы ревью.
2. Если подобный кадавр все-таки возник, держать его понимание в голове совершенно не нужно. Математики оперируют десятками измерений, но никто не требует от них «представлять двенадцатимерное пространство в голове». Им достаточно понимать, как работает такое пространство. Тут то же самое.
3. Если б я на собеседовании задавал такой вопрос - то, главным образом, с целью услышать от кандидата торжественную клятву подобной херни не делать. А рассказ о том, что это и как оно устроено - лишь бонусом.

Deleted
()

Владимир

Забавно. Минут 10 не мог понять в чем дело.
Такой ляпы у меня давненько не было.

Вот цикл:

// --- Добавляем заданное количество правых фигурных скобок
//
 for  ( INT VpNumBracket = 1; VpNumBracket <= cntLeftCurlyBracket++;  VpNumBracket++ )
  strResultText += '}';

А он редиска - бесконечный!
Copy/paste подвело.

anonymous
()

Нечитаемую херню можно написать на любом языке. Тех, кто пишет нечитаемую херню, обычно увольняют.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от annulen

Ну он то может и написан на сишке, но вот тонкости реализации платформы, даже если она совместима с posix - может обрабатывать не точно или не уметь обрабатывать. Да - можно портировать, с интерпретаторами это попроще.

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

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

По-русски это называется задротство и за такой код обычно надо или ругать, или увольнять.

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

за такой код обычно надо или ругать, или увольнять.

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

Deleted
()

unsigned short *(*(**bazz[][7])())[];

это не С++, это С, причём кривой - не надо так

next_time ★★★★★
()

Когда меня такое спрашивают на собеседованиях

вы проходили какие-то неправильные собеседования, адекваты такое не спрашивают

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

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

Ну бывали конторы, в которых так сбивали требования по ЗП у кандидата, показывая, что он дурак. Ещё бывали собеседующие – напыщеные петухи, которые просто выдолбывались и не ставили себе цель найти адекватного сотрудника. Чисто из моего опыта.

beaver
()

^ это си не си++

() как раз намекает либо на кресты, либо на старый стиль, который сейчас не в ходу.

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

Что в нем крутого? Это обертка над cdecl(1).

anonymous
()

Пиши на питоне, там простой синтаксис:

sum([(m+1)*10**(m + [sum([k/10 for k in range(n)][:i+1]) for i in range(len([j/10 for j in range(n)]))][m]) for m in range(n)])

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