C와 같은 언어에서 "단락"이란 무엇입니까?


14

C, C ++, C #, Java 및 기타 여러 언어에서 사용되는 "단락"이라는 용어를 들었습니다. 이것이 무엇을 의미하며 어떤 시나리오에서 사용됩니까?


6
개념에 대한 Wikipedia 기사가 있습니다. en.wikipedia.org/wiki/Short-circuit_evaluation&& 운영자 평가에서 최적화입니다 .
wirrbel

1
@wirrbel 나는 그것이 ||적어도 적용 되어야한다고 생각합니다.
Radu Murzea

1
@RaduMurzea 실제로. 대조 ||&&&|미묘한 차이를 표시. 간단한 프로그램이 평가 1 || printf("yay");0 || printf("yay");1 | printf("yay");0 | printf("yay");differeces을 볼 수
wirrbel

답변:


35

C의 단락은 논리 연산자가 모든 인수를 평가하지 않는 경우입니다.

예를 들어 가지고 &&, 그 꽤 명백 0 && WhoCares상관없이 거짓없는 것입니다 WhoCares이다. 이 때문에 C는 평가를 건너 뜁니다 WhoCares. 동일 1 || WhoCares하지만 항상 사실입니다. 이 때문에 우리는 다음과 같은 코드를 작성할 수 있습니다

CanFireMissiles && FireMissiles()

이렇게하면 잠재적으로 불가능한 작업을 피할 수 있습니다. 미사일을 발사 할 수 없다면 확실히 시도하고 싶지 않습니다. 이것은 포인터, 특히 파일 포인터와 함께 일반적으로 사용됩니다.

 bool isN(int* ptr, int n){
     return ptr && *ptr == n;
 }

이것은 불필요한 컴퓨팅을 피하는 다른 많은 유용한 방법으로 나타납니다.

 isFileReady() || getFileReady()

필요하지 않은 경우 추가 작업을하지 않아도됩니다.


1
언제든지 질문에 답변 한 경우 옆에있는 확인란을 선택하여 질문에 답변 한 것으로 표시 할 수 있습니다.
Daniel Gratzer

7
CanFireMissiles && FireMissiles()부작용을 유발하기 위해 단락을 학대하고 있다고 의심하기 때문에을 좋아하지 않습니다 . 조건부로 작업을 숨기는 것 같습니다. 이러한 코드는 if(CanFireMissiles){FireMissiles();}또는로 작성하는 것이 좋습니다 if(CanFireMissles){didFireMissiles = TryFireMissiles(); if(didFireMissiles){...}}.
Brian

2
나는 유일한 용도는 부작용을 숨기는 것이라고 주장합니다. 일반적으로 "도시 폭파"는 아니지만 포인터 참조 해제 또는 시스템 리소스 사용과 같은 작업도 C에서 자주 수행됩니다. Wikipedia 페이지를 참조하십시오. 사용중인 전체 섹션은 "부정 효과 숨기기"
Daniel Gratzer

2
@jozefg를 사용하면 IsInCache(value) || IsInDatabase(value)IsInDatabase에 시간이 걸릴 수있는 (특히 모바일 장치를 사용하고 네트워크 대기 시간이 문제가되는 경우) 과 같은 비싼 작업을 수행하지 못하게 할 수도 있습니다 .
mgw854 1

4

"단락"은 일반적으로 C에 한정되지 않고 일반적인 개념 인 " 단락 평가 "를 말합니다 .

부울 연산자는 왼쪽에서 오른쪽으로 평가되므로 다른 용어를 불필요하게 만드는 용어가 유용합니다. 따라서 나중에 다른 조건을 제외하는 조건을 검사하여 전체를 평가하는 대신 논리 연산을 부분적으로 평가할 수 있습니다.

예:

while((x && y) == 1) {
    //This bit will not execute if x is 0 or y is 0 but y won't even be 
    //evaluated due to short circuit evaluation if x is 0.
}

더 복잡한 예 :

if((a || b || c || d || e || f || g || h || i || j || k) == 1) {
    /* If any of these are equal to 1 the whole expression is equal to 1,
     * thus doesn't it make sense to short circuit evaluate this?
     * Saves a bunch of time.
     */
}

8
단락은 시간 절약에 관한 것이 아니라 평가되지 않는 것에 관한 것입니다. 평가되지 않는 기능도 평가 될 부작용이 없습니다.
Pieter B

알다시피, == 0그것은 불필요 할뿐만 아니라 실제로 일부 사람들을 혼란스럽게 할 수도 있습니다.
중복 제거기

3

짧은 ciruit 평가 는 상태의 일부를 평가하지 않을 수 있습니다.

예를 들면 다음과 같습니다.

if (true || f()) { ... }

기대하지 않습니다 f.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.