문제

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을 확인하기 전에 속성 값을 확인하거나 동시에 수행 할 수 있습니다. 대부분의 컴파일러는 그렇지 않지만 사양을 완전히 준수하지 못하게하는 것은 없습니다. 심지어 이것 때문에 그러한 코드를 쓰지 말라고 말합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top