여러 조건이있는 if의 실행 순서
여러 조건문이있는 if 문에서 첫 번째 결과가 분명하면 두 번째 조건문이 실행됩니까?
예:
if(i>0 && array[i]==0){
}
조건문을 바꾸면 i의 음수 값에 대해 segfault가 발생할 수 있지만 이렇게하면 segfault가 발생하지 않습니다. 이것이 항상 작동하는지 또는 중첩 된 if 문을 사용해야한다고 확신 할 수 있습니까?
이러한 유형의 평가를 단락 이라고 합니다. 결과가 100 % 명확하면 평가를 계속하지 않습니다.
이것은 실제로 일반적인 프로그래밍 기술입니다. 예를 들어 C ++에서는 다음과 같은 내용이 자주 표시됩니다.
if (pX!=null && pX->predicate()) { bla bla bla }
조건의 순서를 변경 한 경우 널 포인터에서 메서드를 호출하고 충돌 할 수 있습니다. C의 유사한 예제는 해당 구조체에 대한 포인터가있을 때 구조체의 필드를 사용합니다.
또는 다음과 유사한 작업을 수행 할 수 있습니다.
if(px==null || pX->isEmpty()} { bla bla bla }
이것은 또한 if 조건에서 부작용을 피하는 것이 일반적으로 좋은 생각 중 하나입니다.
예를 들어 다음이 있다고 가정합니다.
if(x==4 && (++y>7) && z==9)
경우 x
이며 4
, 다음 y
에 관계없이 값의 증가합니다 z
또는 y
만하면 x
되지 4
, 그것은 전혀 증가되지 않습니다.
연산자 &&
및 ||
오른쪽 전에 왼쪽 표현이 완벽하게 평가됩니다 (모든 부작용 적용) 보장이 평가된다. 즉, 연산자는 시퀀스 포인트를 도입합니다.
또한 lhs에서 식의 값을 결정할 수있는 경우 rhs는 평가되지 않습니다. 즉,와 같은 표현식이 x && y
있고 x가 0 (거짓)으로 평가되면 표현식의 값은 y에 관계없이 거짓이므로 y는 평가되지 않습니다.
이는 시퀀스 포인트를 도입하기 x++ && x++
때문에 다음 과 같은 표현식 이 잘 정의되어 있음을 의미합니다 &&
.
초안 3485 (n3485.pdf)에서
5.14 논리 AND 연산자 [expr.log.and]
logical-and-expression: inclusive-or-expression logical-and-expression && inclusive-or-expression
- && 연산자 그룹은 왼쪽에서 오른쪽 입니다. 피연산자는 모두 상황에 따라 bool로 변환됩니다 (Clause 4). 두 피연산자가 모두 참이면 결과는 참이고 그렇지 않으면 거짓입니다. &와 달리 &&는 왼쪽에서 오른쪽으로 평가를 보장 합니다. 첫 번째 피연산자가 거짓이면 두 번째 피연산자가 평가되지 않습니다.
- 결과는 부울입니다. 두 번째식이 평가되면 첫 번째 식과 관련된 모든 값 계산 및 부작용은 두 번째 식과 관련된 모든 값 계산 및 부작용 전에 시퀀싱됩니다.
참조 URL : https://stackoverflow.com/questions/2456086/order-of-execution-for-an-if-with-multiple-conditionals
'developer tip' 카테고리의 다른 글
Windows 배치 파일에서 문자열을 공백으로 분할하는 방법은 무엇입니까? (0) | 2021.01.06 |
---|---|
웹 워커를 디버깅하는 방법 (0) | 2021.01.06 |
Spring XML 컨텍스트에서 조건부 리소스 가져 오기를 수행하는 방법은 무엇입니까? (0) | 2021.01.06 |
psql 출력에서 알림 비활성화 (0) | 2021.01.06 |
루프에서 JavaScript 클로저의 사용을 설명하십시오. (0) | 2021.01.06 |