LINUX.ORG.RU

История изменений

Исправление lbvf50txt, (текущая версия) :

послушал местных пиарасов Столярова, начал читать второй том и увидел вот такое: https://i.postimg.cc/9MpBGHkH/stolyar.png

Тут анонимус цитирует абзац из 4.3.5 Операции и Выражения. Из второго тома «Системы и Сети» А.В. Столярова.

Конкретно выделяет следующую строку о short-circuit evaluation: «если значения выражения уже определено, второй операнд не вычисляется». Речь и идет о логических операциях.

это и есть ваш легендарный мегапрепод программирования? и много у него в книгах такой дичи? аж перехотелось читать

Всё верно, в логических бинарных операторах при определенных условиях расчитывается только одна часть выражения.

  • В случае Логического И &&, если левое выражение falsely, сразу возвращается falsely. Правая часть не расчитывается.
  • В случае Логического ИЛИ ||, если левое выражение truly, сразу возвращается truly. Правая часть не расчитыатеся.

Могут быть нюансы, например в Ruby "one"||1 вернет «one», 1 || true вернет 1. Т.е. в Ruby возвращаются значения выражений, а не булевый тип как таковой. Но сам факт о частичном исполнении логических бинарных операторов верен.

Код на Go:

package main

import "fmt"

func truly() bool {
	fmt.Println("it is true")
	return true
}
func falsely() bool {
	fmt.Println("it is false")
	return false
}

func main() {
	ans1 := truly() || falsely() // it is true
	ans2 := falsely() && truly() // it is false
	fmt.Println(ans1, ans2)      // true false
}

Код на Go Playground:

https://go.dev/play/p/qRNaXzUV420

Cтоляров пишет верно. В вопросах Си на него можно полагаться смело.

Исправление lbvf50txt, :

послушал местных пиарасов Столярова, начал читать второй том и увидел вот такое: https://i.postimg.cc/9MpBGHkH/stolyar.png

Тут анонимус цитирует абзац из 4.3.5 Операции и Выражения. Из второго тома «Системы и Сети» А.В. Столярова.

Конкретно выделяет следующую строку: «если значения выражения уже определено, второй операнд не вычисляется». Речь и идет о логических операциях.

это и есть ваш легендарный мегапрепод программирования? и много у него в книгах такой дичи? аж перехотелось читать

Всё верно, в логических бинарных операторах при определенных условиях расчитывается только одна часть выражения.

  • В случае Логического И &&, если левое выражение falsely, сразу возвращается falsely. Правая часть не расчитывается.
  • В случае Логического ИЛИ ||, если левое выражение truly, сразу возвращается truly. Правая часть не расчитыатеся.

Могут быть нюансы, например в Ruby "one"||1 вернет «one», 1 || true вернет 1. Т.е. в Ruby возвращаются значения выражений, а не булевый тип как таковой. Но сам факт о частичном исполнении логических бинарных операторов верен.

Код на Go:

package main

import "fmt"

func truly() bool {
	fmt.Println("it is true")
	return true
}
func falsely() bool {
	fmt.Println("it is false")
	return false
}

func main() {
	ans1 := truly() || falsely() // it is true
	ans2 := falsely() && truly() // it is false
	fmt.Println(ans1, ans2)      // true false
}

Код на Go Playground:

https://go.dev/play/p/qRNaXzUV420

Cтоляров пишет верно. В вопросах Си на него можно полагаться смело.

Исходная версия lbvf50txt, :

это и есть ваш легендарный мегапрепод программирования? и много у него в книгах такой дичи? аж перехотелось читать

Всё верно, в логических бинарных операторах при определенных условиях расчитывается только одна часть выражения.

  • В случае Логического И &&, если левое выражение falsely, сразу возвращается falsely. Правая часть не расчитывается.
  • В случае Логического ИЛИ ||, если левое выражение truly, сразу возвращается truly. Правая часть не расчитыатеся.

Могут быть нюансы, например в Ruby "one"||1 вернет «one», 1 || true вернет 1. Т.е. в Ruby возвращаются значения выражений, а не булевый тип как таковой. Но сам факт о частичном исполнении логических бинарных операторов верен.

Код на Go:

package main

import "fmt"

func truly() bool {
	fmt.Println("it is true")
	return true
}
func falsely() bool {
	fmt.Println("it is false")
	return false
}

func main() {
	ans1 := truly() || falsely() // it is true
	ans2 := falsely() && truly() // it is false
	fmt.Println(ans1, ans2)      // true false
}

Код на Go Playground:

https://go.dev/play/p/qRNaXzUV420

Cтоляров пишет верно. В вопросах Си на него можно полагаться смело.