«Возможно ли, что n = 4
назначено в операторе if-else
, поскольку оператор присваивания правильный, но условие if
не будет работать, поскольку синтаксис неверен ....?»
Синтаксис верен, и условие if
работает. Это совершенно верно. И да, присвоение также является действительным / правильным.
С помощью if (n = 4)
вы присваиваете значение 4
локальной переменной функции n
, хотя это имеет меньший смысл, поскольку n
является параметр и предназначен для передачи разных значений при каждом вызове функции fun()
.
Но я предполагаю, что намерение вашего профессора состоит именно в том, чтобы продемонстрировать этот трюк, так что это имеет смысл.
Значит, значение n
больше не 2
; Это 4
.
Это допустимое выражение для условия if
и оценивается как 1
/ true
, поскольку значение / выражение, которое должно быть присвоено, равно или не оценивается как 0
.
Обычно компилятор предупредит вас об этом, тем не менее, чтобы избежать нежелательного результата здесь, предлагая необязательные круглые скобки вокруг присваивания, например: if ((n = 4))
.
Clang:
предупреждение: использование результат присваивания в виде условия без скобок [-Wparentheses]
G CC:
предупреждение: предлагайте скобки вокруг используемого присваивания как значение истинности [-Wparentheses]
Если вы явно хотите удалить эти предупреждения, используйте флаг -Wno-parentheses
. Но не рекомендуется этого делать.
Поскольку условие if
равно true
, оно не попадает в рекурсивную часть в условии else
, и функция fun
немедленно возвращает n
, что равно 4
.
Таким образом, возвращаемое значение 4
отображается при вызове printf()
в вызывающей стороне.
Мой любимый, который нужно запомнить, это:
int war = false;
if (war = true) { launch nuke; }
Кредиты go для WTP .
Может быть, вы уловите шутку. ; -)