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';
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';
}
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)...
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.
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?
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());
@4matey: To chyba już nowy wątek, ale możesz użyć biblioteki filesystem
:
https://en.cppreference.com/w/cpp/filesystem/remove
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
zgodzić się nie mogę
" ... sam wiesz jak wygląda.
struct range range = (wielkosc_znaku == 0) ? (const struct range){'a', 'z'} : (const struct range){'A', 'Z'};
{ a = 'a'; z = 'z'; }
?