Подтвердить что ты не робот

Возвращаемое значение оператора "==" в C

Можно ли предположить, что в C оператор "==" всегда будет оценивать до 1, если два значения равны или могут быть оценены другими "истинными" значениями?

struct ss {
    int id;
};

struct os {
    int sid;
    int state;
};

int count(struct ss *s, int state)
{
    int num = 0;
    // foreach o (of type os*) in a hash table
        num += o->state == state && (s ? o->sid == s->id : 1);

    return num;
}

Итак, o->sid == s->id будет возвращать всегда 1 или 0 или может возвращать другие значения?

4b9b3361

Ответ 1

Можно ли предположить, что в C оператор "==" всегда будет оценивать до 1, если два значения равны или могут быть оценены другими "истинными" значениями?

Да, и поэтому != > < >= <= весь реляционный оператор.

C11 (ISO/IEC 9899: 201x) §6.5.8 Операторы отношения

Каждый из операторов < (меньше), > (больше), <= (меньше или равно) и >= (больше или равно) дает 1, если указанное отношение истинно и 0, если оно false.107) Результат имеет тип int.

Ответ 2

Операторы сравнения (равенства и реляционные) (==, !=, <, >, <=, >=) все возвращают 0 для false и 1 для true - и никакие другие значения.

Логические операторы &&, || и ! менее суетливы в отношении своих операндов; они обрабатывают 0 как ложные и любые ненулевые значения как истинные. Однако они также возвращают только 0 для false и 1 для истины.

Ответ 3

Из стандарта:

6.5.8 Операторы отношения

Каждый из операторов < (меньше), > (больше), <= (меньше или равно) и >= (больше или равно) должно давать 1, если указанное отношение истинно и 0, если оно ложно. Результат имеет тип int.

6.5.9 Операторы равенства

Операторы == (равно) и!= (не равные) аналогичны реляционным операторов, за исключением их более низкого приоритета. Каждый из операторов дает 1, если указанное отношение истинно и 0, если оно ложно. Результат имеет тип int. Для любой пары операндов, верно одно из отношений.

Для логических операндов (&&, ||):

6.5.13 Логический оператор И (или 6.5.14 Логический оператор ИЛИ)

Оператор & (или ||) должен давать 1, если оба его операнда сравниваются не равными 0; в противном случае он дает 0. Результат имеет тип int.

Здесь вы можете проверить последний черновик: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Вывод:

  • Все равенство и реляционный оператор (==, !=, <, >, <=, >=) возвращают 0 для false и 1 для true.

  • Логические операторы (==, ||, !) рассматривают 0 как false и другие значения как true для своих операндов. Они также возвращают 0 как false и 1 как true.

Ответ 4

Можно ли предположить, что в C оператор "==" всегда будет оценивать до 1, если два значения равны или могут быть оценены другими "истинными" значениями?

Да, для стандартного совместимого компилятора это предположение верно:

Языки программирования - C, §6.5.9 Операторы равенства (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):

Каждый из операторов дает 1, если указанное отношение истинно и 0 если оно ложно. Результат имеет тип int.