Może nie jestem z tej planety, ale wydaje mi się, że następujący błąd powinien być błędem składni:
int a[] = {1,2,}; //extra comma in the end
Ale nie jest. Byłem zaskoczony, gdy ten kod został skompilowany w Visual Studio, ale nauczyłem się nie ufać kompilatorowi MSVC, jeśli chodzi o zasady C ++, więc sprawdziłem ten standard i jest on również dozwolony. Możesz zobaczyć 8.5.1 dla reguł gramatyki, jeśli mi nie wierzysz.
Dlaczego to jest dozwolone? To może być głupie bezużyteczne pytanie, ale chcę, żebyś zrozumiał, dlaczego pytam. Zrozumiałbym, gdyby był to pod-przypadek ogólnej reguły gramatycznej - postanowili nie utrudniać gramatyki ogólnej po prostu nie dopuszczać zbędnego przecinka na końcu listy inicjalizującej. Ale nie, dodatkowy przecinek jest wyraźnie dozwolony. Na przykład niedozwolone jest umieszczanie nadmiarowego przecinka na końcu listy argumentów wywołania funkcji (gdy funkcja przyjmuje ...
), co jest normalne .
Czy zatem istnieje jakiś szczególny powód, dla którego ta nadmiarowa przecinek jest wyraźnie dozwolona?
for()
na przykład po dodaniu), dodanie powoduje wygenerowanie ostrzeżenia kompilatora.
if (x = 1)
nie jest dwuznaczny w gramatyce, ale jest bardzo niejednoznaczny dla ludzi, a zatem rzuca ostrzeżenie.
if
przykład też nie jest niejednoznaczny. Nie uważam, że „dwuznaczny” oznacza to, co według ciebie oznacza!
;
gdy jest jasne, że następny token jest tak naprawdę kolejnym stwierdzeniem.