Логические операторы, выражения и операторы условий (логические значения) - PullRequest
1 голос
/ 08 марта 2019

Итак, я перейду к нескольким вещам в программировании на Си, которые я уже упоминал ранее.

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

Напомним, я знаю, что в C логические операторы определяют значениесостояние одним из двух способов, истина или ложь.Что в действительности равно 1 или 0.

Возьмем в качестве примера следующее выражение: (если x равно 4, y равно 5, z is 3)

x > z && y > z

Вставьте значения ...

4 > 3 && 5 > 3

Итак, с точки зрения булевой логики ... Я знаю, что значение этого утверждения на самом деле: 1 && 1, что равно 1 (true)

или ... (с такими же значениями переменных, как указано выше)

z >= x && x <= y

На самом деле значение этого оператора: 0 && 1, что равно 0 (ложь из-за логического &&)

Так вот, где мне нужна помощь ...

Я не могу вспомнить, как приравнять вещи в нескольких различных формах выражений, таких как это: новые значения: x = 3, y = 0, z = -3)

x && y || z

каково логическое значение чего-то подобного?Без каких-либо операторов, таких как <, >, == и !=?

это было бы ...

x && y || z
1    0    1 

что равно 1 для истины?потому что x && y становится ложным (потому что любое ложное с && является ложным), но затем следует || (ИЛИ), которое, если есть истина, это правда?

Имеет ли смысл мой вопрос?

или как насчет выражения, которое выглядит следующим образом ... (если x = 5, y = 1)

!x + !!y

, что будет здесь логическим значением?Это

!(5) + !(!)(1)
  0      1  which would be 1 true? 

Я добавляю ноль и единицу?Наверное, нет.

Я, наверное, слишком обдумал это.

1 Ответ

2 голосов
/ 08 марта 2019

Мы знаем, что ( cppreference ):

  • нулевое значение оценивается как ложное.
  • ненулевое значение оценивается как истинное. Любое ненулевое значение. -3 верно. 1 верно. INT_MAX верно.

Мы также знаем о приоритетах операторов :

  • && имеет более высокий приоритет, чем ||
  • , что означает, что сначала && оценивается, затем ||

Мы также знаем, что true и false в C - это просто макросы для 1 и 0, определенные в stdbool.h, поэтому они имеют тип int. C не имеет «настоящих» логических значений, только логический тип _Bool. Логические операторы && || и ! оцениваются как значения int (!) Типа 1 или 0, см. cppreference .

Итак:

3 && 0 || -3

невероятно равно:

(true && false) || true

, что оценивается как 1.

!5 + !!1

! имеет более высокий приоритет.

Значение оператора ! равно 1 (true) в случае нуля. Значение оператора ! равно 0 (false) в случае ненулевого выражения.

Итак, это:

(! true) + (! (! true) )

false + true

0 + 1

1
...