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++의 모든 문 그룹은 다음과 같이 종료됩니다.
- 세미콜론
- 중괄호
왜 아무 것도 하지 않는 컨스트럭트를 만들까요?
유량제어문 일관성
일관성을 고려할 때...
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();
루프. 이것이 없으면 다음에 대해 명확하지 않습니다.
- 언제 끝나나요?
- 그 사이에 별도의 루프가 발생하면 즉시 루프를 수행합니다.
그렇기 때문에 세미콜론을 마지막에 포함하는 것입니다.do......while
loop, 조건이 false인 경우 여기서 루프가 종료됨을 나타냅니다.
언급URL : https://stackoverflow.com/questions/942251/in-c-c-why-does-the-do-whileexpression-need-a-semi-colon
'programing' 카테고리의 다른 글
AngularJs 유닛 테스트 메모리 누수 (0) | 2023.10.27 |
---|---|
이벤트가 사람에 의해 트리거되었는지 확인합니다. (0) | 2023.10.27 |
Chrome 브라우저로 재생되지 않는 MP4 HEVC 비디오 (0) | 2023.10.22 |
XPath를 사용하여 특성 가져오기 (0) | 2023.10.22 |
unix:/var/run/docker.sock에서 도커 데몬에 연결할 수 없습니다.도커 데몬이 실행 중입니까? (0) | 2023.10.22 |