2016-08-07 1 views
1

, 예기치 않게 나는 어떤 독방 감금 오류하지 않았다. 그러나 내가 p*p의 순서를 if() (예 : 댓글에서)로 변경하면 seg 오류가 발생합니다.null 포인터 디 레퍼런스에 segfault가없는 이유는 무엇입니까?</p> <pre><code>int main() { int *p = NULL; if (p && *p); //if (*p && p); return 0; } </code></pre> <p>나는이 코드를 실행 나는이 간단한 C 코드를 작성했습니다

누군가 설명 할 수 있습니까?

+0

첫 번째는 표준 ideom입니다. 당신이 조금 연구를했다면 당신 자신을 알았을 것입니다. 아니면'&&'연산자에 대한 설명을 읽었습니까? 하지만 처음에는 묻는 것이 배움보다 쉽습니다. 레. 두 번째 변형 ('* p %% p') : 왜 세그 폴트를 기대합니까? 정의되지 않은 동작을 호출합니다. ** undefined **라는 단어의 의미에 대해 생각해보십시오. – Olaf

답변

4

& & 연산자는 단락 회로 평가를합니다. 결과가 왼쪽 피연산자의 값을보고 판단 할 수 있으면 오른쪽 피연산자는 평가되지 않습니다. & & 연산자의 경우, 이것은 왼쪽이 false로 평가되면 오른쪽을 평가하지 않고 결과가 false임을 의미합니다. 상기 & & 연산자 비트 이진 & 연산자 달리

: 즉,

if (p && *p) ... 

C11 표준과
if (p) if (*p) ... 

섹션 6.5.13/4에 상당 왼쪽에서 오른쪽으로의 평가를 보장합니다. 두 번째 피연산자가 계산 된 경우 번째 피연산자와 두 번째 피연산자의 평가 사이에 시퀀스 포인트가 있습니다. 첫 번째 피연산자가 0과 비교되면 두 번째 피연산자는 평가되지 않습니다.

+0

귀하의 답변에 대한 언급이 있으십니까? –

+0

@ParthaBera : 추가되었습니다. –

+0

이것은 c에도 적용됩니까? –

관련 문제

 관련 문제