Если заявления и фигурные скобки .. Другой результат с / без

Итак, я нахожусь в процессе изучения C ++, и я столкнулся со странным эффектом, работая с одним из учебных пособий, и я не совсем понимаю, когда это происходит …

Для учебника (скопированного из предложенного примера) я написал функцию в рамках специализации шаблона класса, которая проверяет, является ли символ строчными, а затем делает его прописными:

char uppercase ()
{
//checks to see if "element"(char) is a lower-case letter between 'a' and 'z'
if ((element >= 'a') && (element <= 'z'))
{
//changes value of "element" to be element + (value of A - Value of a)[-32]
element += 'A' - 'a'; //element = element + -32
return element;
};
};

Теперь, как ни странно … даже если символ уже в верхнем регистре, этот код все еще срабатывает. Поэтому, если я вызываю функцию со значением «j», я, очевидно, получаю «J», как и предполагалось. Однако, если я вызываю со значением ‘J’, функция все равно проходит … поэтому вместо функции, которая ничего не меняет, она вместо этого возвращает ‘*’.

Теперь, что интересно … если я уберу скобки из оператора if, он будет работать как задумано. Итак, с

char uppercase ()
{
//checks to see if "element"(char) is a lower-case letter between 'a' and 'z'
if ((element >= 'a') && (element <= 'z'))
//changes value of "element" to be element + (value of A - Value of a)[-32]
element += 'A' - 'a'; //element = element + -32
return element;
};

это работает полностью, как задумано. Вызов функции со значением «J» просто возвращает «J», потому что условия не были выполнены, и, следовательно, код не был выполнен. Теперь я знаю, что фигурные скобки являются необязательными для операторов if, но в руководстве говорится, что фигурные скобки необходимы для более чем одного оператора.

Также стоит отметить, что добавление else к выражению с использованием фигурных скобок с простым возвратом дает желаемый эффект, но это должно быть ненужным, верно?

Итак, в основном … я что-то упустил в фигурных скобках, или это просто проблема с компилятором (Visual Studio 2012)?

0

Решение

Это за дизайн, if принимает только один оператор, фигурные скобки составляют блок один оператор.

Если вы хотите область с отступом, используйте Python.

Проблема с вашим кодом в том, что вы ничего не возвращаете, когда if оператор не соответствует, что приводит к неопределенному поведению. Ваш компилятор, вероятно, дает вам предупреждение об этом. Не игнорируйте предупреждения компилятора.

Второй блок кода на самом деле то, что вы хотите, только изменить переменную element Когда ваш if совпадает, но всегда возвращает переменную element,

3

Другие решения

В первом случае вы не выполняете return заявление, если условие не выполнено. Предположительно функция возвращает мусор.

Во втором случае из-за отсутствия фигурных скобок только одна строка зависит от условия. return Оператор выполняется независимо. Другими словами, ваш второй пример эквивалентен:

char uppercase ()
{
//checks to see if "element"(char) is a lower-case letter between 'a' and 'z'
if ((element >= 'a') && (element <= 'z'))
{
//changes value of "element" to be element + (value of A - Value of a)[-32]
element += 'A' - 'a'; //element = element + -32
}
return element;
};
2

У вас есть заявление if. Если оператор оценивается как true, он выполнит операцию, следующую сразу за ней. Чтобы выполнить более одной операции одновременно, вы должны заключить их в фигурные скобки.

Вы получаете странный ответ с фигурными скобками, потому что если J является верхний регистр, ваш оператор if равен false, вы пропускаете скобки, и у вас нет заданного возвращаемого значения (отсюда и бессмысленное возвращаемое значение). Вы должны сказать, что вернуть, если ваше заявление if не правда.

Ваш второй фрагмент кода работает, потому что только первая строка после оператора if контролируется if. По сути, вам здесь повезло — если бы у вас было две операции, которые вы хотели сделать, вы все равно получили бы мусор. Поэтому обычно рекомендуется явно указывать код, который вы хотите выполнить с помощью оператора if, помещая его в фигурные скобки, даже если это одна операция.

0