왼쪽에서 오른쪽으로 표현 평가
문제
C#에서는 표현식이 왼쪽에서 오른쪽으로 평가된다는 것이 보장됩니까?
예를 들어:
myClass = GetClass();
if (myClass == null || myClass.Property > 0)
continue;
준수하지 않는 언어가 있습니까?
해결책
실제로 "단락 논리식"이라는 언어 기능을 참조합니다.
이것이 의미하는 바는 다음과 같습니다.논리식의 결과가 더 이상 변경될 수 없는 경우.표현식이 무슨 일이 있어도 "true" 또는 "false"로 평가될 것이 분명한 경우 표현식의 나머지 부분은 평가되지 않습니다.
예를 들어 C#, Java 또는 JavaScript가 이를 수행하며 해당 언어에서 이를 사용하여 질문에 답할 수 있습니다.
귀하의 경우 MyClass가 null이 아닌 경우:
MyClass == null
거짓으로 평가- "or" 표현식이므로 두 번째 부분은 여전히 결과를 변경할 수 있으므로 평가됩니다.
myClass.Property > 0
최종 결과를 결정합니다
MyClass가 null인 경우:
MyClass == null
사실로 평가- "또는" 표현이므로 뒤에 무엇이 나오든 상관없습니다.
- 더 이상 평가가 수행되지 않으며 최종 결과는 true입니다.
논리식을 단축하지 않는 언어도 있습니다.클래식 VB가 한 예입니다. 여기서 "myClass.Property > 0"은 평가되고 MyClass가 null인 경우(VB에서는 "Nothing"이라고 함) 오류를 생성합니다.
다른 팁
단락은 C# 3.0 사양의 7.11 절에 설명되어 있습니다.
작동 x || y는 작동 x |에 해당합니다 y, y는 x가 사실이 아닌 경우에만 평가됩니다.
그렇습니다. 괜찮습니다.
다른 언어에 관해서는 - 나는 결코 말하고 싶지 않습니다. 모두 언어. vb.net에서는 단락 된 오라스와 안달 소를 사용할 수 있지만 단단하지만 평범하거나 그렇지 않습니다.
그러나 조심하십시오 :
당신이 같은 것이 있다면
sprintf (buf, " %s %s", func1 (& var), func2 (& var));
VAR에 대한 부작용을 사용하면 정의되지 않음 (C에서는 평가 순서가 다른 언어로 정의되는지 확실하지 않음), Order func1 () 및 func2 ()가 실행되는 순서 (왼쪽 또는 왼쪽 또는 왼쪽 또는 오른쪽) 논쟁은 스택에 놓여 있고 거기에서 평가됩니다.
ADA, Visual Basic 및 Pascal과 같은 언어로 된 운영자는 단락되지 않습니다. 그들은 ADA의 "및 다음"및 "또는 else"와 같은 기능을 허용하기 위해 추가 연산자를 제공합니다.
확실하지 않습니다. 순서 나 단락 평가에 정말로 관심이 있습니까?
나는 100% 확실하지 않지만, 내가 아는 한, 평가 순서는 항상 C#에서 동일하게 될 것입니다 (그리고 모든 .NET 언어는 아니라고 가정합니다). 단락 평가는 이전 답변에서 설명한대로 작동합니다.
그러나 C#에서는 간단한 연산자 (& 대신)를 사용하여 회로를 단락시키지 않도록 선택할 수 있습니다. 일반적으로 단락을 원하지만 모든 평가를 실행하려는 경우 일 수 있습니다.
파이썬에는 단락이 있습니다 or
그리고 and
운영자.
Java와 Haskell && 및 || 단락.
흥미로운 제쳐두 : Haskell에서 이것은 자연스럽게 언어와 함께 제공됩니다 (이 작업을 수행하는 자신의 운영자를 정의 할 수 있습니다). 특정한 이 두 연산자를 위해.
실제로 단락은 일부이지만 언어가 그에 대한 왼쪽에서 오른쪽으로 평가되는지 여부를 알아야합니다. 예를 들어 C (ANSI, ISO, C99)는 왼쪽에서 오른쪽으로 평가를 보장하지 않습니다. 샘플 코드에서는 NULL을 확인하기 전에 속성 값을 확인하거나 동시에 수행 할 수 있습니다. 대부분의 컴파일러는 그렇지 않지만 사양을 완전히 준수하지 못하게하는 것은 없습니다. 심지어 이것 때문에 그러한 코드를 쓰지 말라고 말합니다.