Istnieje wspólny argument na temat inicjalizacji wielu zmiennych w jednym wkładce, to znaczy:
Rozważmy na przykład int i, j = 1; co może doprowadzić niektórych ludzi do błędnego przekonania, że obie zmienne są inicjalizowane
Możemy argumentować, że ktoś powinien znać składnię swojego języka na tyle, żeby się nie mylić. Kolejnym argumentem może być to, że programiści uczą się tak wielu języków, że możemy popełniać błędy między specyfikami między językami.
Jednak w tym konkretnym przypadku zastanawiam się, czy istnieje nawet język, w którym sama składnia i, j = 1 inicjuje obie zmienne?
Jeśli nie, ten argument nie ma zastosowania.
programming-languages
syntax
Walfrat
źródło
źródło
Dim Apple, Orange, Pear as Fruit
jest deklaracja prawna. Załóżmy, że nie znasz VB. Czy twoje pierwsze wrażenieApple
jest tego rodzajuFruit
? Nie jest. Pamiętaj, że języki często czytają ludzie, którzy nie są ekspertami w tym języku; jeśli jesteś ekspertem, mądrze posługuj się językiem, aby jasno przekazać swoje zamiary nawet osobom niebędącym ekspertami. Nigdy nie używam wielu inicjalizacji w żadnym języku.var x = 1, y = 1.5;
Czy to jest to samo,int x = 1; double y = 1.5;
czy to to samo, codouble x = 1, y = 1.5;
? Kiedy dodaliśmyvar
do C # 3.0, zrobiłem ankietę i odkryłem, że około połowa ludzi uważa, że pierwsza jest „oczywiście” poprawna, a druga połowa uważa, że druga jest „oczywiście” poprawna, dlatego też zrobiliśmy to nielegalnym. Funkcja, która wprowadza w błąd połowę populacji, jest złą cechą.Odpowiedzi:
Myślę, że nie, ale nie o to chodzi. Chodzi o to, że
i, j = 0
jest bardzo łatwo pomylići = j = 0
, co robi initialize obu. Klarowność jest najważniejszym wymogiem dotyczącym kodu źródłowego obok poprawności, a fakt, że to pytanie nawet powstaje, dowodzi, że klarowność jest nieoptymalna.źródło
int i, j=1
porównaniu zint i; int j = 1
(a nawet lepiej, osobnymi wierszami)?”Myślę, że możesz argumentować za którąkolwiek ze stron:
Kontra
i, j = 0
:Matematycy zrobić to wykorzystać, aby oznaczać, że zarówno
i
ij
mają być zero.Pro
i, j = 0
:Prostą sprawą jest znajomość pierwszeństwa swoich operatorów. A jeśli masz wątpliwości co do ich pierwszeństwa, nadszedł czas, aby to sprawdzić.
To ten sam powód, dla którego piszemy rzeczy
a.b += c[i]*d[i];
bez nawiasów. Oczywiście jest to równoważne(a.b) += ((c[i])*(d[i]));
, ale można się spodziewać, że programiści znają na pamięć pierwszeństwo najczęściej używanych operatorów i są w stanie sprawdzić pierwszeństwo operatorów, gdy nie są pewni. Tak więc nawiasy są ogólnie uważane za bezużyteczne, jeśli nie wymuszają innej kolejności oceny, niż nakazałaby pierwszeństwo operatora.Oczywiście, istnieją wyjątki. Pierwszeństwo
<<
i+
jest ogólnie uważane za wystarczająco dwuznaczne, aby uzasadnić nawiasy w obu przypadkach. Ale to wyjątek potwierdzający regułę.Ja, na przykład, wpadłbym bardziej na stronę Pro, ale jestem gotowy trzymać się każdego przewodnika po stylach, który zabrania takich deklaracji. To po prostu nie jest warte walki.
źródło
int i, j = 0;
nie ma w nim operatorów . Jedynym wyrażeniem w tym stwierdzeniu jest,0
dlatego też nie ma w nim pierwszeństwa operatorów . Analizator składni nie jest traktowany,
jako operator przecinka ani=
operator przypisania; są to raczej gramatyczne części oświadczenia.but programmers can be expected to know the precedence of the most used operators by heart
, mówisz. W podanym przez ciebie przykładzie nie jestem pewien, czy większość (przeciętnych) programistów postrzega operatora dostępu do elementu lub operatora indeksu tablic jako operatorów w sensie matematycznym, ale zamiast tego traktuje je bardziej jako rzeczowniki języka naturalnego i mnożenie operator jako czasownik. Właśnie dlategoint i, j, k = 0;
jest tak diabelskim konstruktem, ponieważ przedstawia jako naturalny język analog „int zmiennych i, j i k, są zadeklarowane i powinny być ustawione na 0”!*a[i]
, nie sądzę, że możesz wystarczająco przeanalizować to za pomocą analogii „rzeczowników”. Co doint i, j, k = 0;
tego, może to znaczyć wszystko, jeśli nie spojrzysz na reguły: Trzecią interpretacją byłoby zadeklarowanieint i
, następnie ocenaj
i ostatecznie przypisaniek = 0
. Jeśli nie znasz składni swojego języka, nie możesz analizować takich konstrukcji. W każdym razie to twój problem.a[i]
jako zastosowanego operatora indeksua
, ale raczej czytałem oba razem jako nieredukowalny element składniowy określający operand operatora mnożenia, a zatem nie byłem nawet proszony o ocenę pierwszeństwa. (1/2)