kiedy dawać klamry w instrukcji if else

0

ostatnie pytanie przed kolokwium kiedy dawać klamry w instrukcji if else?

10

Zawsze. Mówię serio. O wiele lepiej się czyta i mniej błędów wyprodukujesz.

2

Z całą pewności musisz je dać gdy masz więcej niż jedną instrukcję ,która ma wykonywać się w ifie/elsie.

4

Na Twoim poziomie: zawsze. Mniej zagwozdek, mniej problemów.

0

Dziękuję :)

A jeżeli mam samo if to też dawać nawiasy?

2

Też.

4

To się ustala dla każdego projektu pod nazwą "Coding Standard".
Większość projektów (99%) ma politykę ZAWSZE.

Jak się praktykuje rady Uncle Bob z "Clean Code", kod dzieli się na bardzo małe funkcje, więc każdy branch kodu składa się tylko z jednej instrukcji: wywołania jednej funkcji.
Efekt jest taki, że w takim przypadku klamry nie są przydatne, więc ma politykę NIGDY.

0

tzn. kiedy nie ma else tylko jest if

5

Wtedy też. Zawsze używaj klamer. Dla if, dla for, dla while, dla else if.

0

@kq:

Na Twoim poziomie: zawsze.

Jakie jest sensowne NIE dla niedawania 'wąsów' przy jednej instrukcji?
Chyba, że coś specyficznego, niskopoziomowego, jakaś zaszłość konkretnie dla C (znam C tyle co wcale)

2

Poprawna odpowiedź: - Kiedy for/while/if/else zawierają więcej niż jedną instrukcje rozdzielone średnikami lub kiedy tego wymaga czytelność kodu.

for(int i=0,k=1;i<10;++i)  cout<<i<<" "<<k<<endl , k<<=1; // tu dwie instrukcje rozdzielone przecinkami - nie trzeba klamer
1

IMO można dyskutować o coding style który zezwala na ify bez klamer dla super prostych instrukcji. Czasem ma to pozytywny wpływ na czytelność.

1

Mam wrażenie ,że nie do końca rozumiesz nawiasy klamrowe. Nawiasy klamrowe spinają to co ma się wykonać wewnątrz czegoś (jakiejś instrukcji if,for,while...) Jeśli ich nie ma kompilator domyślnie przyjmie ,że w tej instrukcji ma być wykonana tylko jedna instrukcja. To czy stosujesz przed czy po nie ma żadnego znaczenia.

4
bool zmienna, dupa;
///..............
if (zmienna)
	dupa();
else
	if (dupa)
		sialalala();
	else
		umpaumpa();

W takim kodzie coś śmiedzi. "Uciekajcie" - zakrzyknąwszy spazmastycznie Marysia z Powiśla sama rzuciła się do ucieczki.
Tymczasem używajcie klamer.

6

kiedy dawać klamry w instrukcji if else?

Jeśli w danym miejscu jest miejsce (trochę dziwnie mi się napisało, ale chyba wiadomo, o co chodzi) na jedno polecenie, ale chcesz tam umieścić więcej poleceń, to tworzysz blok kodu wydzielony klamrami. To jest wersja oficjalna. To, o czym pisali wyżej chłopacy to też prawda - zarówno, ze dobrze jest je dawać zawsze (zwiększenie czytelności), jak i to, że jak wydzielisz całość do osobnej funkcji to klamry nie będą potrzebne,

pytanie przed kolokwium

To sugeruje, ze nie interesują nas dobre standardy, clean code albo ustalenia wewnątrz projektu, tylko kwestie formalne. Dlatego - jak zaraz pokażę - klamry dajesz tam, gdzie chcesz wstawić kilka poleceń w miejscu przewidzianym na jedno. Przykładem niech będzie IF - po sprawdzeniu warunku daje się jedną komendę:

if (padaDeszcz) bedzieszMokry();

jakbyś chciał dać tam kilka rzeczy, które mają się wykonać po spełnieniu warunku, to wtedy właśnie stosujesz klamry. One powodują, że objęty nimi blok kodu jest (w dużym uproszczeniu) traktowany jako jedna całość/jedno polecenie. Czyli miałbyś wtedy coś w stylu:

if (padaDeszcz) {
  zalozKalosze();
  zalozKurtke();
  wezParasol();
  iTakPewnieBedzieszMokry();
}

A teraz jak to powinno być zrobione zgodnie z zasadami clean code oraz dobrymi zwyczajami:

void przygotujSieNaDeszcz() {
  zalozKalosze();
  zalozKurtke();
  wezParasol();
  iTakPewnieBedzieszMokry();
}

if (padaDeszcz) przygotujSieNaDeszcz();

Rzuć też okiem na http://prac.us.edu.pl/~siminski/c_cxx/c_cxx_w03s.pdf, poza kwestią nawiasów masz tam też kilka ciekawych informacji, które mogą Ci się przydać.

Nawiasy klamrowe (ang. braces) { } oznaczają początek i koniec instrukcji złożonej, zwanej również blokiem

0

Ja podam jeszcze warunek brzegowy, gdzie nie użyłbym klamerek. Jak mamy kod jakiegoś "dispatchera", albo parsera danych, coś takiego jest zgrabne, i byłoby zaśmiecone dodatkami:

if (fun1(x)) return Enum1;
if (fun2(x)) return Enum2;
if (fun3(x)) return Enum3;
if (fun4(x)) return Enum4;
1

@enedil: > ##### enedil napisał(a):
Ja podam jeszcze warunek brzegowy, gdzie nie użyłbym klamerek. Jak mamy kod jakiegoś "dispatchera", albo parsera danych, coś takiego jest zgrabne, i byłoby zaśmiecone dodatkami:

if (fun1(x)) return Enum1;
if (fun2(x)) return Enum2;
if (fun3(x)) return Enum3;
if (fun4(x)) return Enum4;

Tu akurat użyłbym vector<pair<bool(*)(int),TEnum>> oraz foreach

1 użytkowników online, w tym zalogowanych: 0, gości: 1