주문 확인하는 조건에서 C

0

질문

그래서 나는 독서의 순서에 대해 다른 사업자,그리고 내가 읽 && 높은 보다 중요성 || 과 평가 빨리(소스). 그런 다음 누군가가 질문에 대해 무엇이 작품의 코드는 인쇄:

#include <stdio.h>
int main(){
    int a=0, b=0, c=0, d=0;
    if(a++>0 || ++b==1 || c--<=0 && d++>c--){
        printf("if\na:%d\nb:%d\nc:%d\nd:%d\n",a,b,c,d);
    }
    else{
        printf("else\na:%d\nb:%d\nc:%d\nd:%d\n",a,b,c,d);
    }
    return 0;
}

고 생각했는 c-- <= 0 && d++ > c-- 평가 첫 번째는,진실입니다. 후 프로세스 c 것과 같 -2 고 d 것 1. 그것은 체크인 시작에서 왼쪽 평가 a++ > 0 || ++b == 1 진실하고, a 1 서 b 은 1 조건 및 그 후. 그래서 총 조건이 될 것이다 true || true 그리고 그것은 사실,그래서 우리는 인쇄:

if
a:1
b:1
c:-2
d:1

Yes? 분명히,no. 나는 그것을 테스트 GCC(Mingw)시스템에(Windows10)및 온라인 컴파일러(이 하나의)모두와 인쇄:

if
a:1
b:1
c:0
d:0

나는 변경을 조건으로 이: if(a++>0 || ++b==1 || (c--<=0 && d++>c--) ) 그러나는 출력은 정확히 같은 것은 모두에서 장소입니다. 뭔가가는 내가 주목하지 않는? 또는 이것이 뭔가요? 그것은 거의 보이는 좋아하는 ||&& 의 우선 순위가 같고 전체 평가 왼쪽에서,및 단락이 발생하고는 다른 것들입니다. 변경하는 경우 ++b==1 부로 ++b==0다음과 같은 내가 예언합니다.
사전에 감사를 위해 어떠한 종류의 도움이됩니다:)

1

최고의 응답

4

식에서 이 질문:

if(a++>0 || ++b==1 || c--<=0 && d++>c--)

고전의 예로 끔찍한,끔찍한 식 무 비현실적이고 실용적이고 punishingly 이해하기 어려운,그럼에도 불구하고의 좋은 일을 보여주는 매우 중요한 포인트: 우선 순위와 동일하지 않기 위해의 평가.

무엇보다 우선이 정말 우리에게는 얼마나 사업자는 매혹과 그들의 피연산자를 사용합니다. 그래서 주어진 단순화된 표현

A || B || C && D

는 두 가지 부분식을 하는 첫 번째 ||고,두 번째 ||&& 실제로 넥타이를 함께 운영하는가? 만약 당신이 컴파일러 작가,당신은 이러한 질문에 대답을 구성하여"코"는 명시적으로 보여주는 부분식(s)와 함께 이동하는 연산자가 있습니다.

그래서 주어진 식이 A || B || C && D정,분석을 위해 나무 식과 같습니다:

        &&
       /  \
     ||    D
    /  \
  ||    C
 /  \
A    B

또는 다음과 같다:

  ||
 /  \
A    ||
    /  \
   B    &&
       /  \
      C    D

또는 다음과 같다:

      ||
     /  \
    /    \
  ||      &&
 /  \    /  \
A    B  C    D

이 대답을 우리는 알아야 할 뿐만 아니라는 우선 순위 && 보다 높 ||지만,또한 || 은 왼쪽에 결합성을 갖습니다. 이러한 사실을 표현식

A || B || C && D

가로 구문 분석되었을 경우 기록

(A || B) || (C && D)

그리고,따라서 결과에서 세 번째로 세 후보는 분석이 나무를 보여줬:

      ||
     /  \
    /    \
  ||      &&
 /  \    /  \
A    B  C    D

하지만 지금 우리에 위치하는 정말 보는 방법"단락시키는"동의 ||&& 운영자가 적용될 수 있습니다. 는"최고" || 을 평가 왼쪽과 후면 그것은 거짓도를 평가합니다. 마찬가지로,낮 || 을 평가하는 그것의 왼쪽을. 그래서,상관없이, A 을 먼저 계산됩니다. 식에 대해서는 원래 질문에 해당하는 a++ > 0.

지금 a++>0 은 거짓,그래서 우리가 있는 평가 B++b == 1. 지금,그것 사실,그래서 그 결과의 첫번째 || 은"true".

그래서 그 결과는 두 번째의(위) || 연산자입니다 또한"true".

그래서 오른쪽 상단의 || 연산자가 있지 않을 평가한다.

그래서 전체 부분식 포함 && 이 평가되지 않을 모든.

그럼에도 불구 && 가장 높은 우선 순위,그것은 결국 마지막으로 고려하고,(이후 재료 왼쪽에 참여 || 었 true)이 끝나지 않았다고 평가했다.

결론으로,나는 말에 의해 시작했는 우선 순위가 결정하지 않는 평가 순서.

또한,그것이 아니었다면 말도 다른 곳에서 이상,왼쪽에서 오른쪽 동작은 상에 대해 ||&& 사업자(및 다른 방법으로,에 대한 원 ?: 운전자). 는 경우에는 표현했다

A + B + C * D

그것은 것이 었다는 사실,그리고 앞서 말한 것처럼,"비록 무엇, A 을 평가 첫 번째". 산술 같은 연산자 +*방법은 없는지 여부를 알 왼쪽 또는 오른쪽을 먼저 계산됩니다.

2021-11-24 12:41:40

완벽하고 합리적이다. 다시 감사합니다.
III_phr

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................