Existe um argumento comum sobre a inicialização de múltiplas variáveis em um único liner, ou seja:
Considere, por exemplo, int i, j = 1; o que pode levar algumas pessoas a acreditar erroneamente que ambas as variáveis estão sendo inicializadas
Poderíamos argumentar que alguém deveria conhecer a sintaxe suficiente de sua linguagem para não se enganar sobre isso. Outro argumento pode ser que, como desenvolvedores, aprendemos tantas línguas que podemos cometer erros entre as especificidades entre as línguas.
No entanto, para esse caso muito específico, estou me perguntando o seguinte: existe uma linguagem em que a própria sintaxe i, j = 1 inicializa as duas variáveis?
Caso contrário, esse argumento não se aplica.
programming-languages
syntax
Walfrat
fonte
fonte
Dim Apple, Orange, Pear as Fruit
é uma declaração legal. Suponha que você não conheça o VB. Sua primeira impressãoApple
é do tipoFruit
? Não é. Lembre-se de que os idiomas são frequentemente lidos por pessoas que não são especialistas nesse idioma; se você é um especialista, use o idioma com sabedoria para comunicar claramente suas intenções, mesmo para não especialistas. Eu nunca uso várias inicializações em qualquer idioma.var x = 1, y = 1.5;
É o mesmoint x = 1; double y = 1.5;
ou é o mesmo quedouble x = 1, y = 1.5;
? Quando adicionamosvar
ao C # 3.0, fiz uma pesquisa e descobri que cerca de metade das pessoas acreditava que a primeira estava "obviamente" correta e a outra metade acreditava que a outra estava "obviamente" correta, e por isso a tornamos ilegal. Um recurso que engana totalmente metade da população é um recurso ruim.Respostas:
Acho que não, mas esse não é o ponto. O ponto é que
i, j = 0
é muito facilmente confundido comi = j = 0
, que faz initialize ambos. A clareza é o requisito mais importante no código-fonte, próximo à correção, e o fato de que essa questão ainda se coloca prova que a clareza é subótima.fonte
int i, j=1
versusint i; int j = 1
(ou melhor ainda, linhas separadas)?"Eu acho que você pode argumentar de ambos os lados:
Kontra
i, j = 0
: Osmatemáticos usam isso para significar que ambos
i
ej
deveriam ser zero.Pro
i, j = 0
:É uma simples questão de conhecer a precedência de seus operadores. E se você tiver dúvidas sobre a precedência deles, agora é a hora de procurá-lo.
É a mesma razão pela qual escrevemos coisas como
a.b += c[i]*d[i];
sem parênteses. É claro que isso equivale a(a.b) += ((c[i])*(d[i]));
, mas é esperado que os programadores conheçam a precedência dos operadores mais usados de cor e possam procurar a precedência dos operadores quando não tiverem certeza. Assim, os parênteses são geralmente considerados desordenados inúteis, a menos que forçam uma ordem de avaliação diferente da prescrita pela precedência do operador.Claro, há exceções. A precedência
<<
e+
geralmente é considerada ambígua o suficiente para garantir parênteses em ambos os casos. Mas essa é a exceção que prova a regra.Eu, por exemplo, cairia mais no lado profissional, mas estou preparado para seguir qualquer guia de estilo que proíba tais declarações. Simplesmente não vale a pena brigar.
fonte
int i, j = 0;
não há operadores nele. A única expressão nessa declaração é0
e, portanto , a precedência do operador não entra nela. O analisador não trata,
como o operador de vírgula ou=
como o operador de atribuição; pelo contrário, essas são partes gramaticais da declaração.but programmers can be expected to know the precedence of the most used operators by heart
, você diz. No exemplo que você dá, não tenho certeza de que a maioria dos programadores (médios) concebe o operador de acesso a membros ou o operador de índice de matriz como sendo operadores no sentido matemático, mas pense neles mais como substantivos da linguagem natural e a multiplicação operador como o verbo. É por isso queint i, j, k = 0;
é uma construção tão diabólica, porque se apresenta como o análogo da linguagem natural das "variáveis int i, j e k, são declaradas e devem ser definidas como 0"!*a[i]
, não acho que você possa analisar isso suficientemente com a analogia dos "substantivos". Quanto aint i, j, k = 0;
isso, isso pode significar qualquer coisa, se você não procurar as regras: uma terceira interpretação seria declararint i
, depois avaliarj
e finalmente atribuirk = 0
. A menos que você conheça a sintaxe do seu idioma, não poderá analisar essas construções. O problema é seu se você fizer assim mesmo.a[i]
como um operador de índice aplicadoa
, mas li os dois juntos como um elemento sintático irredutível, especificando o operando do operador de multiplicação e, portanto, nem fui solicitado a avaliar a precedência. (1/2)