1994

Стилистические Войны программистов

Когда-то давным давно я склепал и залил в инет несколько юмористических картинок касательно стилистики написания кода на C++, которые мгновенно разлетелись и вызвали тогда много срача жарких дискуссий на эту тему... И вот перерывая свои старые и пыльные архивы я сейчас снова на них случайно наткнулся. Поэтому решил поделиться с вами полной подборкой. :)

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

// [0]

Стилистические Войны программистов Программирование, C++, Юмор, Длиннопост

// [1]

Стилистические Войны программистов Программирование, C++, Юмор, Длиннопост

// [2]

Стилистические Войны программистов Программирование, C++, Юмор, Длиннопост

// [3]

Стилистические Войны программистов Программирование, C++, Юмор, Длиннопост

А вот вариант от некоего пользователя под ником Ges( если ты есть на Пикабу, то респект тебе - долго смеялся с твоей картинки :)) )

Стилистические Войны программистов Программирование, C++, Юмор, Длиннопост

P.S. Баянометр ругался на одну отдельно выложенную картинку :)

Лига программистов C/C++

65 постов4.8K подписчиков

Правила сообщества

Соблюдайте правила Pikabu:

https://pikabu.ru/html.php?id=wtf


Помимо этого ЗАПРЕЩЕНО:

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

Вы смотрите срез комментариев. Показать все
111
Автор поста оценил этот комментарий
Dog* dog
Иллюстрация к комментарию
раскрыть ветку (23)
8
Автор поста оценил этот комментарий

мне кто-нибудь может объяснить почему принято именно Dog *dog?

раскрыть ветку (22)
51
Автор поста оценил этот комментарий

В случае с "Dog* a, b" можно подумать что и a и b являются Dog*, хотя это совсем не так. Здесь a это Dog*, а b просто Dog. Чтобы и a и b были Dog* надо написать Dog *a, *b. Как-то не слишком понятно получилось

раскрыть ветку (6)
9
Автор поста оценил этот комментарий

"Dog* a, b" - это уже гомосексуализьм!

Иллюстрация к комментарию
4
Автор поста оценил этот комментарий

не, норм...спасибо. А зачем объявлять переменные таким образом? ) Часто ли вы так делаете?
Я б разнес на 2 строки, и так Dog* - это указатель на класс Dog, а a - это переменная этого типа.
Но вообще то, что вы описали - вариант, ага ) И становится понятно, почему так исторически сложилось )

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Много кто разносит на несколько строк. Хотя мне, например, удобнее написать в одну строчку что-то вроде int **a, *b, чем делить это на несколько строк.

1
Автор поста оценил этот комментарий
я не программист, но все понял)
0
Автор поста оценил этот комментарий

а ещё можно так:

std::shared_ptr<Dog> a, b;

и никаких неоднозначностей :)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

typedef std::weak_ptr<Dog> DogWPtr;
typedef std::shared_ptr<Dog> DogPtr;


DogWPtr dog0;
DogPtr dog1;
Dog* dog2;

12
Автор поста оценил этот комментарий

Просто звездочка относится к переменной, а не к типу, как и амперсанд, так что логика в этом есть:

int a, *b, **с, &d, &&e;

a - переменная типа int

b - указатель на int

c - указатель на указатель на int

d - ссылка на int

e - rvalue ссылка на int

и т.п.

Это не значит, естественно, что так писать правильнее или неправильнее. Если один пишешь - пиши как тебе нравится, если в команде - то так, как принято в команде.

2
Автор поста оценил этот комментарий

Подчеркивается семантика, что dog - это указатель на объект Dog. Но непонятно тогда, как писать, когда из функции возвращается указатель (имени указателя нет в явном виде).


Dog *dog;
Dog* getMyDog(); // ???
раскрыть ветку (13)
0
Автор поста оценил этот комментарий

Хм, еще один плюсик в пользу левого варианта :)

0
Автор поста оценил этот комментарий
Dog *getMyDog();

Очевидно же.
Я за правый вариант.

раскрыть ветку (11)
5
Автор поста оценил этот комментарий

Нет. Очевидно так:

(Dog *) getMyDog() - (type) val

1
Автор поста оценил этот комментарий
Не очевидно, объясните. Почему астериск именно там?
раскрыть ветку (9)
Автор поста оценил этот комментарий
Вкратце: язык навязывает.

Полнее если, то так.

Для переменной тип указывается слева, там же для функции указывается тип возвращаемого значения.

Если переменная — указатель, то перед именем ставится астериск. Дальше выполняем тесты на «что должно быть в пустом квадрате», то есть, экстраполируем. Получается, что астериск ближе к имени субъекта должен быть, неважно, переменная ли, функция ли.

раскрыть ветку (8)
1
Автор поста оценил этот комментарий
то перед именем ставится астериск.

вступает в конфликт с


неважно, переменная ли, функция ли.

Ибо возвращаемое значение функции (то, что является указателем) не именуется, а к имени функции это не имеет отношения вовсе.

раскрыть ветку (7)
Автор поста оценил этот комментарий
Не вступает. Я же не сказал «перед именем ПЕРЕМЕННОЙ». Это уже вы сами себе ограничения придумываете, а вините в своих выдумках почему-то меня.
раскрыть ветку (6)
1
Автор поста оценил этот комментарий
Не вступает. Я же не сказал «перед именем ПЕРЕМЕННОЙ»

Эм...)) Вас не смущает, что у возвращаемого значения функции (того субъекта, который является указателем) нет имени?

раскрыть ветку (5)
Автор поста оценил этот комментарий
Вообще нет. Поднимитесь выше на один уровень абстракции. Функция и переменная — два способа получить значение.

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

В обоих случаях есть имя, перед которым есть куда влепить астериск для разыменовывания, операции, в общем случае не нуждающейся в имени, поскольку, к примеру, у «*a» уже нет имени, но если это указатель, можно разыменовать второй раз.

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

И мы приходим к изначальному «вкратце»: язык навязывает.

раскрыть ветку (4)
1
Автор поста оценил этот комментарий
Функция и переменная — два способа получить значение.

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


к примеру, у «*a» уже нет имени, но если это указатель, можно разыменовать второй раз.

Вы путаете операцию разыменования и тип указателя.

раскрыть ветку (3)
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку