Hay un argumento común sobre la inicialización de múltiples variables en un solo revestimiento, es decir:
Considere por ejemplo int i, j = 1; lo que podría llevar a algunas personas a creer erróneamente que ambas variables se están inicializando
Podríamos argumentar que alguien debería saber lo suficiente la sintaxis de su lenguaje para no equivocarse al respecto. Otro argumento podría ser, como desarrolladores, aprendemos tantos idiomas que podemos cometer errores entre las especificidades entre idiomas.
Sin embargo, para ese caso muy específico, me pregunto lo siguiente: ¿existe incluso un lenguaje en el que la sintaxis misma i, j = 1 inicialice ambas variables?
Si no ese argumento, entonces no se aplica.
programming-languages
syntax
Walfrat
fuente
fuente
Dim Apple, Orange, Pear as Fruit
es una declaración legal. Supongamos que no sabes VB. ¿Tu primera impresiónApple
es de tipoFruit
? No lo es. Recuerde, los idiomas a menudo son leídos por personas que no son expertos en ese idioma; Si es un experto, use el lenguaje sabiamente para comunicar sus intenciones claramente incluso a los no expertos. Nunca uso múltiples inicializaciones en ningún idioma.var x = 1, y = 1.5;
¿Es esto lo mismoint x = 1; double y = 1.5;
o es lo mismo quedouble x = 1, y = 1.5;
? Cuando agregamosvar
a C # 3.0, hice una encuesta y descubrí que aproximadamente la mitad de las personas creía que la primera era "obviamente" correcta y la otra mitad creía que la otra era "obviamente" correcta, por lo que lo hicimos ilegal. Una característica que engaña completamente a la mitad de la población es una mala característica.Respuestas:
Creo que no, pero ese no es el punto. El punto es que
i, j = 0
se confunde muy fácilmentei = j = 0
, lo que inicializa ambos. La claridad es el requisito más importante en el código fuente junto a la corrección, y el hecho de que esta pregunta incluso surja demuestra que la claridad es subóptima.fuente
int i, j=1
versusint i; int j = 1
(o incluso mejor, líneas separadas)?"Creo que puedes argumentar por cualquier lado:
Kontra
i, j = 0
: Losmatemáticos usan esto para significar que ambos
i
yj
se supone que son cero.Pro
i, j = 0
:es una simple cuestión de conocer la precedencia de sus operadores. Y si tiene dudas sobre su precedencia, ahora es el momento de buscarlo.
Es la misma razón por la que escribimos cosas
a.b += c[i]*d[i];
sin paréntesis. Por supuesto, esto es equivalente a(a.b) += ((c[i])*(d[i]));
, pero se puede esperar que los programadores sepan de antemano la precedencia de los operadores más utilizados y puedan buscar la precedencia de los operadores cuando no estén seguros. Por lo tanto, los paréntesis generalmente se consideran desorden inútil a menos que forcen un orden de evaluación diferente al que prescribiría la precedencia del operador.Por supuesto, hay excepciones. La precedencia de
<<
y+
generalmente se considera lo suficientemente ambigua como para evitar paréntesis en cualquier caso. Pero esa es la excepción que prueba la regla.Yo, por mi parte, caería más en el lado Pro, pero estoy preparado para apegarme a cualquier guía de estilo que prohíba tales declaraciones. Simplemente no es un asunto por el que valga la pena luchar.
fuente
int i, j = 0;
no tiene operadores . La única expresión en esa declaración es0
y, por lo tanto , la precedencia del operador no entra en ella. El analizador no se trata,
como el operador de coma o=
como el operador de asignación; más bien, estas son partes gramaticales de la declaración de declaración.but programmers can be expected to know the precedence of the most used operators by heart
, tu dices. En el ejemplo que da, no estoy seguro de que la mayoría de los programadores (promedio) conciban al operador de acceso de miembros o al operador del índice de matriz como operadores en absoluto en el sentido matemático, sino que los consideran más como sustantivos de lenguaje natural y la multiplicación operador como el verbo. ¡Es por eso queint i, j, k = 0;
es una construcción tan diabólica, porque se presenta como el lenguaje análogo natural de "int variables i, j, y k, se declaran y se establecerán en 0"!*a[i]
, no creo que puedas analizarlo lo suficiente con la analogía de los "sustantivos". En cuanto aint i, j, k = 0;
eso, eso podría significar cualquier cosa si no busca las reglas: una tercera interpretación sería declararint i
, luego evaluarj
y finalmente asignark = 0
. A menos que conozca la sintaxis de su idioma, no puede analizar tales construcciones. Es tu problema si lo haces de todos modos.a[i]
como un operador de índice aplicadoa
, sino que leí ambos juntos como un elemento sintáctico irreducible que especifica el operando del operador de multiplicación, y por lo tanto ni siquiera me pidieron que evaluara la precedencia. (1/2)