2011-11-16 8 views
7

po prostu wpadł na ten kawałek kodu, który wykonuje to:Składnia C/C++ - Rozdzielanie instrukcji za pomocą, zamiast; prawny?

delete a, a = 0; 

To kompiluje i działa dobrze. Ale czy to nie powinno być:

delete a; 
a = 0; 

Dlaczego rozdziela się wyciągi używając, dozwolone w tym przypadku?

Dzięki :)

+3

Nazywa się to operatorem przecinka: http://www.cplusplus.com/doc/tutorial/operators/. –

+2

To powinna być odpowiedź, a nie komentarz. – Mysticial

+0

Oczywiście, przykład tutaj jest C++, a nie C. :-) – ibid

Odpowiedz

6

To jest przecinek. Ocenia oba argumenty i zwraca drugi.

+0

@Mankarse: Już naprawiony, dzięki. –

5

To jest operator przecinka. Może służyć do oddzielania wyrażeń, ale nie deklaracji.

+0

Możesz wprowadzić wiele deklaracji tego samego typu przecinkami. –

7

W językach C i C++ większość "instrukcji" to w rzeczywistości wyrażenia. Średnik dodany do wyrażenia czyni z niego wyrażenie. Alternatywnie dozwolone jest (ale prawie zawsze zły styl) oddzielanie wyrażeń efektownych od siebie od operatora przecinka: wyrażenie po lewej stronie jest oceniane pod kątem skutków ubocznych (a jego wartość jest odrzucana), a prawa ręka -side wyrażenie jest oceniane pod względem jego wartości.

1

Chociaż można napisać taki kod, może to być nieco dziwne. Nieco bardziej realistyczny USECASE byłoby jeśli masz struct T następująco:

struct T { 
    bool check() const; 
    void fix(); 
}; 

Teraz chcesz iterację wszystko w struktury i uruchomić sprawdzić na nim, a następnie zadzwonić naprawić jeśli check zwraca false. Prostym sposobem wykonania tej czynności będzie:

for (list<T>::iterator it = mylist.begin(); it < mylist.end(); ++it) 
    if (!it->check()) 
     it->fix(); 

Udawaj, że chcesz napisać tak krótko, jak to możliwe. fix() powracająca próżnia oznacza, że ​​nie możesz po prostu umieścić jej w stanie. Jednak za pomocą operatora przecinek można obejść ten problem:

for (auto it = mylist.begin(); it != mylist.end() && (it->check() || (it->fix(), true)); ++it); 

nie będę go używać bez szczególnie dobry powód, ale to nie pozwalają wywołać dowolną funkcję z powodu stanu, który może być wygodne.

Powiązane problemy