C와 같은 언어에서 “단락”이란 무엇입니까? 기타 여러 언어에서

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



답변

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

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

CanFireMissiles && FireMissiles()

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

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

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

 isFileReady() || getFileReady()

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


답변

“단락”은 일반적으로 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.
     */
}

답변

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

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

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

기대하지 않습니다 f.