문제

PHP 코드에서

if(a() && b())

첫 번째 피연산자가 평가할 때 false, b() 평가되지 않습니다.

마찬가지로

if (a() || b())

첫 번째 피연산자가 평가할 때 true, b() 평가되지 않습니다 ..

Java, C#등과 같은 모든 언어에 대해 이것이 사실입니까?

이것이 우리가 사용한 테스트 코드입니다.

<?php
function a(){
echo 'a';
return false;
}

function b(){
echo 'b';
return true;
}


if(a() && b()){
echo 'c';
}
?>
도움이 되었습니까?

해결책

이것은 ... 불리운다 단락 평가.

일반적으로 C (C, C ++, Java, C#)에서 파생 된 언어는 모두 그렇지만 모든 언어에는 해당되지 않습니다.

예를 들어, vb6은이를 수행하지 않으며 초기 버전의 vb.net에서 수행되지 않았습니다. VB8 (Visual Studio 2005) 그리고 또한 그리고 ORELSE 이 목적을위한 운영자.

또한 의견에서 CSH는 오른쪽에서 왼쪽으로 단락 평가를 수행하여 문제를 더욱 혼란스럽게 만드는 것으로 보입니다.

또한 단락 평가 (또는 부족)는 인식 할 위험이 있음을 지적해야합니다. 예를 들어, 두 번째 피연산자가 부작용이있는 함수 인 경우 코드는 프로그래머가 의도 한대로 정확하게 수행되지 않을 수 있습니다.

다른 팁

VB6은 사실이 아닙니다.

vb.net에서는 "Andalso"대신 "Andalso"와 "두 번째 표현식 평가를 건너 뛰려는 경우 사용해야합니다.

Java, C#등과 같은 모든 언어에 대해 이것이 사실입니까?

C#에서 이것은 단락 연산자에게만 해당됩니다.||' 그리고 '&&';; 만 사용하는 경우 '|' 또는 '&'매번 양쪽을 평가할 것입니다.

라고 불린다 단락 평가 그리고 대부분의 언어는 이것을합니다. 어떤 언어에는 이것을하지 않는 운영자가 있습니다.

Pascal의 원래 버전은 많은 슬픔을 일으켰습니다. 델파이와 같은 현대 파스칼은 C et al과 같은 방식으로 작동합니다.

ADA에는 특별한 단락 형태의 조건부가 있습니다.

and then
or else

다음과 같이 사용 :

if p.next /= null and then p.next.name = 'foo'
if x = 0 or else 1/x = y

어떤면에서는 프로그래머가 표현이 단락되어야한다는 것을 알았으며 조건부가 우연히 작동하지 않는다는 것을 추론 할 수 있기 때문에 좋습니다.

C : PHP, Java, C ++, C#, ... 또는 Perl과 같은 동일한 "영감"의 언어에 해당됩니다.

그러나 VB는 사실이 아닙니다 (적어도 .NET 이전에 새로운 키워드를 도입했습니다).
(그리고 그것은 당신이 VB와 함께 일하는 첫 번째 것을 정말로 혼란스럽게합니다 ^^)

Microsoft vbscrip ( '클래식'ASP와 함께 종종 사용) 부울 연산자에 대한 단락 평가가 없었으며 대신 비트 평가를 사용합니다. 그것은 아마도 최악의 언어 일 것입니다!

"vbscript는 논리적이지 않다는 것입니다. vbscript는 약간 적습니다. 모든 소위 논리 연산자는 부울 값이 아닌 숫자에서 작동합니다! 정수, 정수의 각 비트 쌍에서 논리적 작동을 수행하고 결과를 반환하십시오. true true가 -1이고 false가 0이면 모든 비트가 켜지고 0이 모든 비트가 켜졌기 때문에 모든 것이 작동합니다. 꺼짐. 그러나 다른 숫자가 거기에 들어가면 모든 베팅이 꺼져 있습니다. "

가져 왔습니다 이 블로그. 에릭 립퍼트 (Eric Lippert).

델파이에서는 컴파일러 옵션입니다.

이것은 Java에게도 마찬가지이지만 연산자 |, 등은 양쪽을 평가합니다.

Erlang에서 and 그리고 or 연산자는 단락 평가를 수행하지 않습니다. 당신은 사용해야합니다 orelse 그리고 andalso 단락 동작을 원한다면 연산자.

Standard Fortran 또는 Fortran에서 부울 표현의 피연산자는 어떤 순서로도 평가 될 수 있습니다. 불완전한 평가는 허용되지만 구현은 정의됩니다.

이를 통해 엄격한 왼쪽에서 오른쪽으로 순서가 시행되면 허용되지 않는 부울 표현의 최적화가 가능합니다. 엄격한 순서가 필요한 표현은 별도의 조건부로 분해되어야합니다. 또는 구현 의존적 가정이 이루어져야합니다.

분해가 순서를 시행하는 데 사용되기 때문에 진술이 항상 단일 표현식으로 최적화 될 수는없는 경우 분리됩니다. 그러나 단락 평가는 분해로 명시 적이며, 이는 게으른 평가를 허용하기 위해 엄격한 왼쪽에서 오른쪽 순서를 강화하는 언어보다 결코 나쁘지 않습니다.

언어는 Fortran (Fortran, Basic, VBN) 및 Fortran과 같은 효율성 (Pascal, ADA)을 달성하도록 설계된 언어에서 파생 된 언어에서 파생되었습니다.

대부분의 언어 (내가 본 모든)는 && 및 ||와 같은 조건부 운영자에게 단락 평가를 사용합니다. 조건 중 하나가 요구 사항을 충족하자마자 평가를 중단합니다. (첫 번째 거짓 &&. 첫 번째 True on ||)

& 및 |와 같은 모든 이진 연산자가 처리됩니다. (원래의)

& 및 |와 같은 모든 비트 타이어 운영자가 처리됩니다. (편집 : 5/10/17)

이를 단락 평가라고하며 VB, VB.NET 및 Fortran을 제외하고 내가 일한 모든 언어 (C, C ++, C#, Java, Smalltalk, JavaScript, LISP)에서 일반적입니다.

실제로 매우 유용한 기능입니다. 단락 없이는이 작업을 수행 할 수 없습니다.

if (a != null && a.isBlank())

단락으로 인해 A가 무인도로 오류가 발생하기 때문에 진술을 중첩해야 할 것입니다.

ColdFusion은 기본적으로 단락 평가를 수행합니다. 나는 모든 CF 개발자가 다음을 작성했다고 확신합니다.

<cfif isdefined("somevariable") and somevariable eq something>
//do logic
</cfif>

Matlab은 "표준"을 구별하는 한 언어입니다. 논리 연산자 그리고 단락 연산자:

  • & (및 운영자) 및 | (또는 연산자)는 배열에서 요소별 방식으로 작동 할 수 있습니다.
  • && 및 || 두 번째 피연산자는 결과가 첫 번째 피연산자에 의해 완전히 결정되지 않은 경우에만 평가되는 단락 버전입니다. 이것들은 만 작동 할 수 있습니다 스칼라, 배열이 아닙니다.

다른 답변은 단락 평가 유무에 관계없이 언어의 좋은 예를 제공하여 반복하지 않습니다.

추가 할 흥미로운 점이 하나뿐입니다. Clojure와 같은 Lisps는 부울 단락 평가가 있지만 또한 사소하게 정의 할 수 있습니다. 어느 매크로 사용을 통해 단락 평가를 좋아하는 작업자.

Clojure에서 단락 "NAND"작업의 예 :

(defmacro nand 
  ([x] 
    `(not ~x))
  ([x & xs] 
    `(let [nand# (not ~x)]
       (if nand# 
         true               ; short circuit if we can prove the nand is true
         (nand ~@xs)))))    ; continue with the other expressions otherwise

(nand true true)
=> false

(nand false (println "Expression with a side effect!"))
=> true
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top