programing

C/C++에서 (식이) 진행되는 동안 세미콜론이 필요한 이유는 무엇입니까?

telecom 2023. 10. 22. 19:25
반응형

C/C++에서 (식이) 진행되는 동안 세미콜론이 필요한 이유는 무엇입니까?

내 생각엔 파싱이 더 쉬워진 것 같은데, 왜 그런지 정확히 알 수가 없네요.

그럼 이게 뭐가...

do
{
  some stuff
}
while(test);

more stuff

그것이 ...보다 낫습니다

do
{
  some stuff
}
while(test)

more stuff

당신이 그 진술을 끝내려고 하니까요.문장은 블럭(괄호꼴로 구분됨) 또는 세미콜론으로 끝납니다."do this while this"는 하나의 문장으로, 블록으로 끝날 수 없기 때문에 다른 문장과 마찬가지로 세미콜론이 필요합니다.

C++ 문법을 보면 반복문은 다음과 같이 정의됩니다.

하는 동안에 조건. ) 진술

(-init-statement condition-opt; expression-opt) 대해

하다 진술 하는 동안에 표현 ) ;

참고 사항:do-while진술은 다음과 같습니다.;맨 끝에그래서, 문제는 왜 그가do-while다른 것들과 너무 달라서 추가로 필요합니다.;.

자세히 살펴보겠습니다. 둘 다for정기적으로while성명서로 끝납니다. 하지만.do-while통제적인 표현으로 끝을 맺습니다.(). 그 포위망의 존재는()이미 컴파일러가 제어식의 끝을 명확하게 찾을 수 있게 해줍니다: 바깥쪽 닫힘.)식이 끝나는 위치 및 따라서 전체를 지정합니다.do-while문장이 끝납니다.다른 말로 하자면, 종결자는;정말로 중복되는 것입니다.

그러나 실제로 그것은 예를 들어 다음과 같은 코드를 의미합니다.

do
{
  /* whatever */
} while (i + 2) * j > 0;

문법적 관점에서 유효하지만, 정말로 다음과 같이 해석될 것입니다.

do
{
  /* whatever */
} while (i + 2)

*j > 0;

이것은 형식적으로는 건전하지만 직관적이지는 않습니다.그런 이유로 더 명확한 종결자를 추가하기로 결정했다고 생각합니다.do-while문장 - 세미콜론물론 @Joe White의 대답에 따라, 단순하고 단순한 일관성에 대한 고려도 있습니다: C의 모든 일반적인 (복잡하지 않은) 문장은 a로 끝납니다.;.

그 이유는 진술이 실행 중 루프 내에서 유효하기 때문입니다.

세미콜론이 필요 없는 경우 다음과 같은 다양한 동작을 고려합니다.

int x = 10;
int y = 10;

do 
  while(x > 0)
    x--;
while(x = y--);

저는 답을 모르지만, 일관성이 가장 좋은 논쟁인 것 같습니다.C/C++의 모든 문 그룹은 다음과 같이 종료됩니다.

  1. 세미콜론
  2. 중괄호

왜 아무 것도 하지 않는 컨스트럭트를 만들까요?

유량제어문 일관성

일관성을 고려할 때...

if (expr) statement;
do statement; while (expr);
for (expr; expr; expr) statement;
while (expr) statement;

모든 흐름 제어 구조는 세미콜론으로 끝납니다

그러나 블록 진술 양식에 주목할 수 있다는 것에 대항하여,do while는 세미콜론으로 구분됩니다.

if (expr) { ... }
do { ... } while (expr);
for (expr; expr; expr) { }
while (expr) { }

따라서 ';' 또는 '}'이 있지만 '벌거벗은'은 절대 없습니다.)'

문 구분 기호의 일관성

우리는 적어도 모든 문장은 다음과 같이 구분되어야 한다고 말할 수 있습니다.;아니면}, 시각적으로도 진술을 구분할 수 있게 도와줍니다

세미콜론이 필요 없는 경우 다음을 고려합니다.

do statement1; while (expr1) statement2; do ; while (expr2) statement3; while (expr3) statement4;

이를 시각적으로 해결하기란 매우 어려운 일입니다.

do statement1; while (expr1)
statement2;
do ; while (expr2)
statement3;
while (expr3) statement4;

대조적으로, 다음은 다음과 같이 더 쉽게 해결됩니다.;그 직후에while조건은 당신에게 그것을 위해 뒤로 찾으라고 말합니다.do, 그리고 다음 진술은 그것과 관련이 없다는 것입니다.while:

do statement1; while (expr1); statement2; do ; while (expr2); statement3; while (expr3) statement4;

사람들이 흐름을 이해할 수 있도록 코드를 입력하는 것을 고려하면 문제가 됩니까?예, 이유:

  • 사람들은 가끔 실수를 하기도 하고(또는 코드가 마사지 된 것처럼 일시적으로 실수를 하기도 합니다) 시각적으로 눈에 띄면 더 쉽게 고칠 수 있다는 것을 의미합니다.
  • 매크로 대체는 한 줄에 여러 개의 문장을 함께 묶을 수 있으며, 문제를 해결하거나 QA를 수행하는 동안 전처리기 출력을 시각적으로 확인해야 하는 경우도 있습니다.

전처리기 사용에 대한 시사점

또한 유명한 전처리기 사용법에도 주목할 필요가 있습니다.

#define F(X) do { fn(X); } while (false)

이는 다음과 같이 대체할 수 있습니다.

if (expr)
    F(x);
else
    x = 10;

...yields...

if (expr)
    do ( fn(x); } while (false);
else
    x = 10;

세미콜론이 아닌 경우에는do while성명서, 그 다음에if문은 다음과 같이 해석됩니다.

if (expr)
    do-while-statement
; // empty statement
else
    x = 10;

그 에 두 그리고 그 다음에 두 가지 진술이 있기 때문입니다.if, 완전한 것으로 간주되고 있습니다. 그리고 이것은.else문장이 일치하지 않습니다.

C는 세미콜론으로 종결됩니다(Pascal은 세미콜론으로 분리됨).거기에 세미콜론을 떨어뜨리는 것은 일관성이 없을 것입니다.

솔직히 말해서, 나는 그 동안 두루프를 재사용하는 것이 싫어요.제 생각에는 반복하는 것이 덜 혼란스러웠을 것 같습니다.하지만 그것이 바로 그것입니다.

C/C++에서 공백은 구조에 기여하지 않습니다(예: 파이썬).C/C++에서 문장은 세미콜론으로 종료해야 합니다.허용되는 항목:

do
{
  some stuff; more stuff; even more stuff;
}
while(test);

내 대답은, 우리가 세미콜론을 종료에 포함시키지 않았을 때, 컴파일러가 혼란을 겪을 수 있다는 것입니다.do.....while();루프. 이것이 없으면 다음에 대해 명확하지 않습니다.

  1. 언제 끝나나요?
  2. 그 사이에 별도의 루프가 발생하면 즉시 루프를 수행합니다.

그렇기 때문에 세미콜론을 마지막에 포함하는 것입니다.do......whileloop, 조건이 false인 경우 여기서 루프가 종료됨을 나타냅니다.

언급URL : https://stackoverflow.com/questions/942251/in-c-c-why-does-the-do-whileexpression-need-a-semi-colon

반응형