W języku C++ zdefiniowano zmienną: char zm1;. W jaki sposób można do niej przypisać wartość zgodnie ze składnią języka?
A.
zm1 = "wiadro";
B.
zm1 = 'w';
C.
zm1[2] = 32;
D.
zm1 == 0x35;
Pytanie z egzaminu CKE, czerwiec 2021 (arkusz EE.09-SG-21.06).
Instrukcja zm1 = 'w'; jest poprawnym przypisaniem wartości do zmiennej typu char. W C++ typ char służy do przechowywania pojedynczego znaku, czyli w praktyce małej wartości całkowitej odpowiadającej kodowi znaku, najczęściej z tablicy ASCII lub zgodnej z nią części kodowania. Literał znakowy zapisuje się w apostrofach, np. 'a', '7', '?', 'w'. To ważne: apostrofy oznaczają jeden znak, a nie tekst. Operator = wykonuje przypisanie, czyli zapisuje wartość po prawej stronie do zmiennej po lewej stronie. W praktyce taki zapis może być użyty np. przy wczytywaniu znaku sterującego, oznaczenia wyboru w menu albo przechowywaniu jednej litery odpowiedzi użytkownika. Z mojego doświadczenia warto od razu pilnować różnicy między char, string i tablicą znaków, bo potem w większych programach łatwo o dziwne błędy kompilacji. Dobrą praktyką jest też inicjalizowanie zmiennych, np. char zm1 = 'w';, jeśli znamy wartość już w momencie deklaracji.
W tym pytaniu kluczowe jest rozróżnienie przypisania, porównania, pojedynczego znaku oraz napisu. Zmienna zadeklarowana jako char zm1; jest pojedynczą zmienną znakową, więc można do niej wpisać jedną wartość typu znakowego, na przykład 'w'. Do samego przypisania służy operator =. Operator == działa inaczej: porównuje dwie wartości i zwraca wynik logiczny, czyli informację prawda/fałsz. Wyrażenie w stylu zm1 == 0x35 nie zapisuje niczego do zmiennej, nawet jeśli 0x35 jest poprawnym literałem szesnastkowym i mógłby odpowiadać pewnemu kodowi znaku. To częsty błąd u osób zaczynających programowanie, bo wizualnie = i == są podobne, ale semantycznie robią zupełnie co innego. Trzeba też pamiętać, że zm1 nie jest tablicą. Zapis z nawiasami kwadratowymi, taki jak zm1[2], sugeruje dostęp do elementu tablicy lub obiektu z operatorem indeksowania, a zwykły char takiego indeksowania nie obsługuje. Nie można więc traktować pojedynczego znaku jak ciągu znaków. Podobny problem pojawia się przy napisie "wiadro". Taki zapis w cudzysłowie jest literałem tekstowym, czyli ciągiem znaków zakończonym znakiem null, a nie pojedynczym znakiem. Do przechowywania tekstu w C++ używa się raczej std::string albo tablic znakowych, natomiast char przechowuje jeden znak. Moim zdaniem najlepsza zasada do zapamiętania jest prosta: apostrofy dla jednego znaku, cudzysłów dla tekstu, = dla przypisania, == dla porównania.