Существует общий аргумент об инициализации нескольких переменных в одной строке:
Рассмотрим, например, int i, j = 1; что может привести к тому, что некоторые люди ошибочно полагают, что обе переменные инициализируются
Мы можем утверждать, что кто-то должен знать синтаксис своего языка, чтобы не ошибиться в этом. Другим аргументом может быть то, что разработчики учат так много языков, что могут допускать ошибки между особенностями языков.
Однако для этого очень конкретного случая мне интересно следующее: существует ли вообще язык, в котором сам синтаксис i, j = 1 инициализирует обе переменные?
Если нет, то этот аргумент не применяется.
programming-languages
syntax
Walfrat
источник
источник
Dim Apple, Orange, Pear as Fruit
есть юридическая декларация. Предположим, вы не знаете VB. Ваше первое впечатление такогоApple
типаFruit
? Это не так. Помните, что языки часто читают люди, которые не являются экспертами в этом языке; если вы являетесь экспертом, используйте язык с умом, чтобы четко сообщать о своих намерениях даже неспециалистам. Я никогда не использую множественные инициализации на любом языке.var x = 1, y = 1.5;
Это так же, какint x = 1; double y = 1.5;
или это так же, какdouble x = 1, y = 1.5;
? Когда мы добавилиvar
C # 3.0, я провел опрос и обнаружил, что около половины людей считают, что первое «очевидно» правильно, а другая половина считает, что другое «очевидно» правильно, и поэтому мы сделали его незаконным. Функция, которая вводит в заблуждение половину населения, является плохой функцией.Ответы:
Я думаю, что нет, но это не главное. Дело в том , что
i, j = 0
очень легко перепутатьi = j = 0
, что делает инициализации обоих. Ясность является наиболее важным требованием к исходному коду рядом с корректностью, и тот факт, что этот вопрос даже возникает, доказывает, что ясность является субоптимальной.источник
int i, j=1
отint i; int j = 1
(или даже лучше, отдельных строк)?»Я думаю, вы можете поспорить за любую сторону:
Контра
i, j = 0
:Математики используют это, чтобы означать, что оба
i
иj
должны быть равны нулю.Pro
i, j = 0
:Это просто вопрос знания приоритетов ваших операторов. И если вы сомневаетесь в их приоритете, сейчас самое время посмотреть на него.
Это та же самая причина, почему мы пишем вещи
a.b += c[i]*d[i];
без скобок. Конечно, это эквивалентно(a.b) += ((c[i])*(d[i]));
, но можно ожидать, что программисты будут знать наизусть приоритет наиболее часто используемых операторов и смогут искать приоритет операторов, когда они не уверены. Таким образом, круглые скобки, как правило, считаются бесполезным беспорядком, если только они не приводят к другому порядку оценки, который предписывает приоритет оператора.Конечно, есть исключения. Приоритет
<<
и,+
как правило, считается достаточно неоднозначным, чтобы избежать скобок в любом случае. Но это исключение, которое подтверждает правило.Я, например, больше склонялся бы на сторону Pro, но я готов придерживаться любого руководства по стилю, которое запрещает такие декларации. Это просто не тот вопрос, за который стоит бороться.
источник
int i, j = 0;
нем нет операторов . Единственное выражение в этом утверждении -0
и, следовательно, приоритет оператора не входит в него. Парсер не,
считается оператором запятой или=
оператором присваивания; скорее это грамматические части заявления декларации.but programmers can be expected to know the precedence of the most used operators by heart
, ты говоришь. В приведенном вами примере я не уверен, что большинство (средних) программистов воспринимают оператор доступа к элементу или оператор индекса массива как операторы в математическом смысле, но вместо этого считают их скорее существительными естественного языка и умножением оператор как глагол. Вот почемуint i, j, k = 0;
такая извергательная конструкция, потому что она представляет собой аналог естественного языка: «int-переменные i, j и k объявлены и должны быть установлены в 0»!*a[i]
я, я не думаю, что вы сможете в достаточной степени разобраться с аналогией с «существительными». Что касаетсяint i, j, k = 0;
, это может означать что угодно, если вы не ищите правила: третье толкование было бы объявитьint i
, затем оценитьj
и, наконец, назначитьk = 0
. Если вы не знаете синтаксис вашего языка, вы не сможете разобрать такие конструкции. Это ваша проблема, если вы все равно это сделаете.a[i]
как примененный к нему оператор индексаa
, а скорее читал оба вместе как неприводимый синтаксический элемент, определяющий операнд оператора умножения, и, таким образом, мне даже не предлагалось оценить приоритет. (1/2)