Почему значение моей переменной не изменяется, даже если я передал по ссылке

#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 утверждении случаи, которые выполняют a return , не нужны 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. Строгий ответ определяет и объясняет проблему и содержит потенциальное решение.