Składnia c++, przecinek a średnik

0

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

char a, z;

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

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

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ć

char a, z;

if (wielkosc_znaku == 0) {
    a = 'a';
    z = 'z';
} else {
    a = 'A';
    z = 'Z';
}
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)...

2
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.

0

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

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?

1
4matey napisał(a):

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

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:

remove(nazwa_pliku.c_str());
1

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

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ą:

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

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.

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

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

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