Składnia c++, przecinek a średnik

Składnia c++, przecinek a średnik
4M
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 30
0

Witam mam, kiedy możemy zastąpić średnik przecinkiem, bo niezbyt rozumiem dlaczego ten fragment kodu jest tak zapisany?

Kopiuj
char a, z;

 if(wielkosc_znaku == 0)
                a = 'a', z = 'z';
            else
                a = 'A', z = 'Z';
kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
7

Możemy to zrobić w przypadku, gdy chcemy aby nasz kod odrzucono podczas code review. Nie rób tak.

enedil
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1028
2

Przecinek i średnik się różnią znacząco - średnik oddziela dwa wyrażenia, przecinek tworzy jedno wyrażenie, które ewaluuje lewą stronę, i zwraca jako wartość stronę prawą. Tutaj użyto przecinka, gdyż wartość wyrażenia nie jest używana (tzn nikt nie robi int eeee = (a = 'a', z = 'z');), a przez to, że jest to jedno wyrażenie, to nie musisz pisać klamer. Tzn żeby osiągnąć to co trzeba, należy napisać

Kopiuj
char a, z;

if (wielkosc_znaku == 0) {
    a = 'a';
    z = 'z';
} else {
    a = 'A';
    z = 'Z';
}
koszalek-opalek
  • Rejestracja: dni
  • Ostatnio: dni
3

Kompletnie bez sensu użycie przecinka. Zaciemnianie kodu i proszenie się o błędy.

Co więcej, wiele wytycznych kodowania ma zalecenie, żeby po if else for while (itp.) używać {} nawet, jak jest w nich tylko jedna instrukcja (więc formalnie nie trzeba ich wstawiać). Więc tym bardziej tutaj, gdzie opuszcza się klamerki za cenę utraty czytelności kodu (i potencjalnych błędów w przyszłości)...

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
2
Kopiuj
static struct { char low,high; } tb[]={{'a','z'},{'A','Z'}};

dalej zamiast: a/z
używasz: tb[wielkosc_znaku].low/tb[wielkosc_znaku].high
odpowiednio.

4M
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 30
0

Mam jeszcze jedno pytanko, chciałbym usunąć plik funkcją remove, jednak przy kompilacji wyskakuje mi bląd

Kopiuj
string nazwa_pliku;
cin >> nazwa_pliku;
remove(nazwa_pliku);

a gdy wpisuje w program stałą nazwe pliku wszystko jest ok remove("plik.txt"); . Jak zrobić to poprawnie?

koszalek-opalek
  • Rejestracja: dni
  • Ostatnio: dni
1
4matey napisał(a):

Mam jeszcze jedno pytanko, chciałbym usunąć plik funkcją remove, jednak przy kompilacji wyskakuje mi bląd

Kopiuj
string nazwa_pliku;
cin >> nazwa_pliku;
remove(nazwa_pliku);

a gdy wpisuje w program stałą nazwe pliku wszystko jest ok remove("plik.txt"); . Jak zrobić to poprawnie?

Przeczytaj błąd -- dotyczy niezgodności typów? Ta funkcja jest odziedziczona z C, a w C nie było klasy string (parametr ma być typu const char *). Jeśli już musisz użyć remove, to napisz:

Kopiuj
remove(nazwa_pliku.c_str());
koszalek-opalek
  • Rejestracja: dni
  • Ostatnio: dni
1

@4matey: To chyba już nowy wątek, ale możesz użyć biblioteki filesystem:
https://en.cppreference.com/w/cpp/filesystem/remove

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Jak wyżej, zaś dla starszych C++: remove(nazwa_pliku.c_str());

Może jeszcze a propos:

kq napisał(a):

Możemy to zrobić w przypadku, gdy chcemy aby nasz kod odrzucono podczas code review. Nie rób tak.

Jeżeli ja prowadzę ten code review, to następujące kody przejdą:

  • Kopiuj

char a, z;
if(wielkosc_znaku) a = 'A', z = 'Z';
else a = 'a', z = 'z';

Kopiuj
Ponieważ jak potrzebna będzie dodatkowa zmienna `x`, 
a ktoś spróbuje coś głupiego wsadzić bezmyślnie pomiędzy przecinki
to mu się zwyczajnie się nie skompiluje. Poza tym widać kolejność i jak będzie inna ilość zmiennych to będzie widać na pierwszy rzut oka.

* ```c
char a=wielkosc_znaku?'A':'a';
char z=wielkosc_znaku?'Z':'z';

Ponieważ dla każdej wartości mamy osobny wiersz dodatkowa zmienna x
spowoduje dodatkowy wiersz podobny do poprzedniego.

  • Kopiuj

static struct { char low,high; } tb[]={{'a','z'},{'A','Z'}};

Kopiuj
Ponieważ dodatkowa zmienna, spowoduje dodatkową wartość w strukturze i tyle.

Zaś kod od @enedil:
```c
char a, z;
if (wielkosc_znaku == 0) {
	a = 'a';
	z = 'z';
} else {
	a = 'A';
	z = 'Z';
}

Nie przejdzie, ponieważ łatwo popełnić błąd, np zainicjalizować w if
zaś nie zainicjalizować w else

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.