#c
#c
Вопрос:
#include <iostream>
char toupper(charamp; letter){
switch(letter){
case 'a':
return 'A';
break;
case 'b':
return 'B';
break;
case 'c':
return 'C';
break;
default:
return letter;
}
}
int main()
{
char labRat = 'a';
std::cout << toupper(labRat) << std::endl;
std::cout << labRat;
return 0;
}
Вывод:
A
a
Значение моей переменной не меняется, даже если я передал ее в свою функцию по ссылке. Почему у меня нет второй строки вывода A
?
Комментарии:
1. Вы не меняете ее и даже не вызываете какой-либо UB, так почему это должно измениться?
2. Можете ли вы объяснить, почему вы ожидаете, что оно изменится?
3. Я думаю, вам следует использовать функцию toupper() . Оно определено в заголовочном файле <cctype> . Смотрите cplusplus.com/reference/cctype/toupper
4. Нет, сделайте то или другое. Наличие одного и того же параметра возврата и вывода — это просто плохо.
5. Это не решает вопрос, но в этом
switch
утверждении случаи, которые выполняют areturn
, не нужныbreak
.
Ответ №1:
Вы действительно передаете labRat
по ссылке на функцию, но вы не меняете значение letter
(которое ссылается labRat
на вызывающий объект) в toupper
.
Это не всем по вкусу 1, но код, подобный
return letter = 'A';
это один из способов возврата значения, а также установки ссылочного значения. Выражение присваивания letter = 'A'
имеет значение 'A'
и тип char
.
1 Некоторые программные дома запрещают присваивания в return
операторах, поскольку они могут быть неясными. Также легко неправильно истолковать их как return letter == 'A';
.
Комментарии:
1. Работал в компании, которая запретила все в инструкции return . У них была проблема с компилятором, который ошибался с 64-битной математикой в операторе return и вроде как компенсировал.
2. @user4581301: Забавно, как один дом запрещает одно, а другой — другое. Я запрещаю
std::vector
[]
оператор, если не может быть продемонстрировано, что он имеет существенное преимущество в производительности.
Ответ №2:
Смотрите Улучшенный код:
#include <iostream>
char toupper(charamp; letter){
switch(letter){
case 'a':
letter = 'A';
// return 'A';
break;
case 'b':
letter = 'B';
// return 'B';
break;
case 'c':
letter = 'C';
// return 'C';
break;
default:
return letter;
}
return letter;
}
int main()
{
char labRat = 'a';
std::cout << toupper(labRat) << std::endl;
std::cout << labRat;
return 0;
}
Вы не assigning
являетесь значением letter
переменной в toupper
функции.
Комментарии:
1. Это, вероятно, более разумно, чем то, как я бы это сделал. (Хотя лично я бы удалил
default
регистр, поскольку он больше не нужен.) Проголосуйте!2. @Bathsheba Спасибо
Ответ №3:
Вы не меняете переданный символ в функции toupper, вы просто возвращаете значение.
Комментарии:
1. Строгий ответ определяет и объясняет проблему и содержит потенциальное решение.