Можно ли использовать оператор присваивания в операторах if. Как будто операторы используют логическое выражение

Я ожидал ошибки в if(b=5), так как оператор присваивания используется в операторе if.

Code: 
#include <stdio.h> 

int main() {
        
    int a=10, b=10; 
    if(b=5)
        a--; 
    printf("%d, %d", a, b--);
    return 0;
}

person Community    schedule 30.05.2020    source источник
comment
Прежде всего выберите один язык. C и C++ — это два очень разных языка. Во-вторых, в чем ваши сомнения? Какой у Вас вопрос? В-третьих, если источнику не доверяют, не используйте код сразу откуда угодно. Остерегайтесь ловушки культового программирования.   -  person Some programmer dude    schedule 30.05.2020
comment
Также, пожалуйста, найдите время, чтобы прочитать страницы справки, возьмите SO обзор, прочитайте Как спросить, а также этот контрольный список вопросов. И узнайте, как редактировать свой вопрос.   -  person Some programmer dude    schedule 30.05.2020
comment
Какую ошибку вы ожидали? И почему?   -  person user207421    schedule 30.05.2020
comment
b = 5 на самом деле является выражением, и все выражения дают истинное значение. Ошибки нет, но компилятор выдаст следующее предупреждение: C6282: Неверный оператор: присваивание константы в логическом контексте. Рассмотрите возможность использования '==' вместо этого   -  person Mehroz Mustafa    schedule 30.05.2020
comment
Это допустимо C для выполнения присваивания внутри условия if. Присваивание оценивается по присвоенному значению. Все остальное, кроме присвоенного значения 0, оценивается как условие true.   -  person RobertS supports Monica Cellio    schedule 30.05.2020


Ответы (2)


Вы ожидали, что это вызовет ошибку, потому что это кажется опечаткой при попытке использовать оператор сравнения ==, обычно используемый в операторах if, подобных этому.

if ( b == 5 )

Выражение в операторе if

if ( b = 5 )

на самом деле оценивается как любое выражение в C. В этом случае его вычисление является значением присваивания 5, и поскольку оно не равно нулю, оно эквивалентно true в логическом выражении.

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

К счастью, во многих компиляторах выдается предупреждение. Обязательно включите все предупреждения в параметрах компилятора и никогда не игнорируйте их. Таким образом, вы избежите этих тонких ловушек в будущем.

person Roberto Caboni    schedule 30.05.2020

Внутри оператора if есть действительное присваивание. Результатом такой операции является присвоенное значение (5), которое допустимо внутри оператора if и оценивается как истинное.

На самом деле, любое число, отличное от 0, будет интерпретироваться как истинное.

Может быть, вы уже знаете, но вы не проводите сравнение там. Операция сравнения ==.

person DeltA    schedule 30.05.2020