Присваивание в операторе if - как вывод правильный? - PullRequest
0 голосов
/ 12 июля 2020

код

в случае, если изображение не видно.

#include <stdio.h>
int fun(int n)
{
    if(n=4)
    return n;
    else return 2*fun(n+1);
}
int main()
{
    printf("%d",fun(2));
}

Это фрагмент кода, и на выходе профессор дает 4.

Как вывод правильный? Возможно ли, что n = 4 присваивается в операторе if-else, поскольку оператор присваивания правильный, но условие «if» не будет работать, так как синтаксис неверен, и на выходе будет прямо указано 4.

Ответы [ 4 ]

1 голос
/ 12 июля 2020

Назначение в инструкции if-else является допустимым синтаксисом, и ветвление будет зависеть от значения n.

Пример:

#include <iostream>

int main() {
    int n = 2;

    if (n = 0) {
        std::cout << "Never printed\n";
    }

    if (n = 4) {
        std::cout << "Always printed\n";
    }

    return 0;
}

Проводник компилятора: https://godbolt.org/z/fEYPcq

1 голос
/ 12 июля 2020

Ответ - правильный, синтаксических ошибок нет.

Что происходит, так это то, что = является оператором присваивания, а в C / C ++ (n = 4) является допустимое выражение, которое оценивается как истинное, пока выражение не равно (n = 0), потому что n тогда будет считаться false на C. Обратите внимание, что в C / C ++ 0 равно false, а все остальное - true.

Следовательно, if (n = 4) совершенно корректно и всегда принимает значение true. Конечно, в этом процессе также будет задействовано присвоение.

Таким образом, в приведенном выше коде происходит следующее:

  1. целому числу n присваивается значение 4 in n = 4
  2. (n=4), поскольку выражение возвращает true.
  3. return n (4).

Таким образом, ответ равен 4.

0 голосов
/ 12 июля 2020

Вы должны использовать оператор ==, чтобы сопоставить два совместимых значения. if(n = 4) присвоить 4 значение n, и тогда оператор if всегда будет истинным. Таким образом, возвращаемое значение всегда будет 4.

0 голосов
/ 12 июля 2020

«Возможно ли, что 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 .

Может быть, вы уловите шутку. ; -)

...