programing

왜 C 언어들은 if 문장에서 간단한 조건 주위에 부모를 필요로 합니까?

goodsources 2023. 11. 2. 21:40
반응형

왜 C 언어들은 if 문장에서 간단한 조건 주위에 부모를 필요로 합니까?

바보같이 들리지만 몇 년 동안 저는 이를 필요로 하는 사용 사례를 생각해내지 못했습니다.빠른 구글 검색은 가치 있는 것을 아무것도 드러내지 않았습니다.

기억에서 Bjarne Stroustrup이 언급한 사용 사례가 있었지만, 그것에 대한 참고 자료를 찾을 수 없습니다.

그럼 왜 C 언어로 이것을 가질 수 없습니까?

int val = 0;
if val
  doSomehing();
else
  doSomehinglse();

저는 "렉서에 지원을 추가하는 것을 귀찮아하지 않았다"는 이유를 받아들일 수 있습니다. 이 구문이 다른 언어 구성 요소를 파괴하는지 알고 싶습니다.C/C++에 얼마나 많은 특이한 구문 기능들이 있는지를 고려해 볼 때, 저는 이것이 많은 복잡성을 더했을 것이라고 생각하지 않습니다.

식 주위에 괄호가 없는 경우if다음 문장의 의미는 무엇입니까?

if x * x * b = NULL;

그런가요?

if (x*x)
    (*b) = NULL;

아니면

if (x)
    (*x) * b = NULL;

(물론 이것들은 어리석은 예시이며 명백한 이유로 작동하는 것도 아니지만 요점은 이해합니다.)

TLDR: 구문 모호성의 가능성까지 제거하려면 C에서 괄호가 필요합니다.

다음을 해석하는 방법을 알려주십시오.

if x ++ b;

바보같지만...

if( x ) ++b;

아니면

if( x++ ) b;

아니면 "x"에 오버로드 연산자가 있을 수도 있고, 그러면...

if( x ++ b){;}

편집:

마틴 요크가 언급했듯이 "++"가 우선 순위가 더 높기 때문에 연산자에 티빗 과부하를 추가할 수밖에 없었습니다.현대 컴파일러를 다룰 때는 C++와 함께 오는 과부하 상태를 허용하기 전까지는 그가 전적으로 옳습니다.

저는 "왜 그런 것을 원할까요?"라는 질문보다 "왜 그런 것을 원할까요?"라는 질문이 더 좋을 것 같습니다.불필요한 다른 엣지 케이스를 렉서에 도입하여 4자를 추가로 입력하는 것을 피할 수 있으며, 이미 가능한 모든 케이스를 지원하는 간단한 구문에 예외를 허용함으로써 스펙에 복잡성을 더합니다.프로그래밍 언어에서 큰 가치가 없는 모호함은 말할 것도 없습니다.

한 가지 더 기억해야 할 사항은 C는 테이프 스토리지가 일반적이었던 시기에 생성되었기 때문에 임의 검색을 수행하거나 현재 파일 또는 다른 파일을 역주행하는 것은 실제로 불가능했습니다. 따라서 다른 파일보다 어떤 것(즉, 선언 전달)을 우선해야 하는 이유도 설명할 수 있습니다.함수의 사용) 컴파일러가 스스로 파악할 수 있어야 함에도 불구하고).

단순히 진술서의 조건조항을 종료하는 수단에 불과합니다.다른 언어들은 파이썬에서 "그때" 또는 "if 조건:(다음에 반환됨)"과 같은 다른 수단을 사용합니다. (: 항상 파이썬에서 나를 가져오게 해줘 나는 그것들을 계속 빼놓게 되고 결과적으로 즉시 명백하지 않은 오류를 얻게 됩니다.)

컴퓨터 문법은 일반적으로 문장이나 표현의 다른 부분을 식별하는 독특한 메커니즘을 좋아합니다.이 점에서 다른 어떤 언어보다 낫거나 최악은 아닙니다.C/C++의 엉킴 문제는 문법적 관점에서 모호성을 보여주는 사례이며, 정확한 작동을 보장하기 위해 특별한 경우로 다루어야 합니다.(즉, 컴파일러 구현자를 위한 추가 작업을 추가합니다.)

저도 이 구문을 좋아하지만 구문 분석의 모호성을 피하기 위해서는 다음과 같은 형식이어야 합니다.

여러 문장의 경우:

if val 
{ 
    doSomething();
    doOthers();
}

하나의 진술에 대해:

if val: 
   doSomething();

당신이 상당한 공백을 원하지 않는 한, 당신은 조건이 어떤 언어에서 끝날 때 그것이 () 어떤 언어에서 조건 주위에 그것이 키워드이고 답에 주어진 것과 같은 경우를 구별할 수 있어야 합니다.

x * x * b = NULL이 항상 false로 평가하는 한 조건일 수 있다면, (xx) 컴파일러의 경우 b에 NULL을 할당하는 것은 조건이 언제 끝나고 다음 작업이 시작되는지 알 수 있는 방법이 없습니다.따라서 컴파일러가 언제 상태가 종료되는지 알 수 있는 명시적인 "백마커"가 있어야 합니다.C(++), Java, c# 및 기타 언어에서는 () F#에서 조건을 표시하는 키워드 '그때'이고, 다른 언어에서는 새 줄/오목입니다.

근본적인 이유는 C와 친구들은 '그때' 키워드가 없기 때문에 조건 표현을 구분하는 다른 방법이 필요하기 때문입니다.파스칼이나 PL/1처럼 괄호가 필요 없는 언어들.파스칼, PL/1 등이 'do'를 가지는 'while'에도 마찬가지입니다.

프로그래머가 원하는 출력을 얻기 위해 어떤 식(산술, 논리, 할당 등 일련의 연산자를 포함한)을 풀어야 하는지를 이해하는 데 도움이 되기 때문입니다.

C에 조건을 둘러싼 부언이 존재하는 이유를 적어도 하나의 예를 들 수 있습니다.

예를 들어 다음을 생각해 봅니다.

while(1) do_something();

위는 무한 루프에서 영원히 do_something()을 부를 것입니다.

부모가 필요한 이유는 다음 사항이 애매하기 때문입니다.

while 1 ; do_something();즉, 무언가를 평가하고 그 동안에는 아무것도 하지 않는다는 뜻입니까?아니면 위의 코드 샘플과 같은 의미입니까?

이는 C 구문 부모에서 조건 평가를 중심으로 이것이 필요한 한 가지 이유를 보여주고, (일치성을 위해) 동일한 구문을 확장함으로써 if 문으로 확장되는 것이라고 생각합니다.

취소자:제가 완전히 틀릴 수도 있고, 그 표어가 있는 이유가 완전히 다를 수도 있지만, 적어도 한 가지 예시를 보여줬습니다.

'괄호'와 '부모'를 혼동하시는 것 같습니다.

이것은 C에서 가능합니다.

void doSomething(){}
void doSomethingElse(){}

void main() {
    int val = 0;
    if( val ) 
        doSomething();
    else
        doSomethingElse();
}

모든 "C" 언어가 파레시스 사용을 강제하는 것은 아니며 선택적으로 교정기를 유지합니다.Go(이슈) 프로그래밍 언어는 정반대의 역할을 합니다.

9호에서 동일한 문장을 쓰는 올바른 방법은 다음과 같습니다.

if val {
    doSomething();
} else {
    doSomethingElse();
}

그러면 다음 사항이 유효하지 않습니다.

if x * x * b = NULL; 

다음 중 하나여야 합니다.

if x*x {
    *b=NULL;
}

또는 만약 x {xb=NULL; }

여기서 괄호는 괄호의 부재로 인해 발생하는 모호함을 제거합니다.

부모를 빠뜨리면 실제로 애매모호한 일이 생기는 구체적인 경우는 생각나지 않지만 어딘가에 구석이 있을 것입니다.

로컬로 선언된 변수와 관련이 있을 수 있습니다(에서와 같이).if (bool b = foo())...괄호가 없는 곳에서, 만약에bool형식 선언 또는 전체 조건입니다.후자의 경우에는b조건의 일부가 아니라 if-statement 기관의 첫 번째 토큰이 될 것입니다.

C를 사용하면 다음을 수행할 수 있습니다.

if (x) { // As opposed to java where you need to do if (x == something)
   // your code
}

위에서 볼 수 있듯이 유연성은 다른 사람들이 보여준 것처럼 모호함을 야기합니다.

언급URL : https://stackoverflow.com/questions/2061593/why-do-c-languages-require-parens-around-a-simple-condition-in-an-if-statement

반응형