아무것도 하지 않기 위해 잠시 블록을 사용하는 것은 나쁜 일입니까?
저는 현재 'The C Programming Language' 연습을 하고 있습니다.제 솔루션 중 하나는 다음과 같습니다.
int c;
while ((c=getchar()) != EOF) {
if (c == ' ') {
while ((c = getchar()) == ' ')
{} // do nothing?
putchar(' ');
}
putchar(c);
}
여기서 저는 제 것과 상당히 다른 해결책을 찾았고, 추가 변수를 사용하여 상황을 추적하는 반면, 저는 모든 공간을 건너뛰는 데 시간 루프를 사용합니다.제 솔루션은 약간 지저분하게 느껴지는데, 꼬불꼬불한 교정기 사이에 아무것도 없는 짧은 고리가 있는 것처럼 보이기 때문입니다.저는 이것을 하지 말아야 할 합당한 이유가 있는지요?조언 감사합니다 :-)
전혀 그렇지 않습니다. K&R에서는 이런 것들을 아무것도 하지 않는 루프를 발견할 수 있을 것이라고 믿습니다. 그래서 그것은 공식적인 것과 거의 같습니다.
개인적인 선호도의 문제지만, 저는 이런 무(無)의 고리를 선호합니다.
while(something());
다른 사람들은 세미콜론이 루프라는 사실을 강화하기 위해 별도의 라인으로 가는 것을 선호합니다.
while(something())
;
그러나 다른 사람들은 당신이 한 것처럼 안에 아무것도 들어 있지 않은 괄호를 사용하는 것을 선호합니다.
while(something())
{
}
모두 유효합니다. 마음에 드는 스타일만 골라서 고수하시면 됩니다.
저는 그것이 완벽하게 받아들일 만하다고 생각합니다.
나는 다음과 같이 적을 것입니다.
//skip all spaces
while ((c = getchar()) == ' ') {}
이 한 줄의 코드가 한 가지 일을 한다는 것을 분명히 하기 위해서입니다.
아니면 이렇게 적겠어요.
while ((c = getchar()) == ' ') {
//no processing required for spaces
}
코드의 나머지 형식과 일치하도록 합니다.
저는 개인적으로.
while ((c = getchar()) == ' ');
형식. 세미콜론을 간과하기 쉬운 것 같습니다.
"잠시 블록을 사용하여 나쁜 일을 하지 않는 것이 좋습니까?"라는 질문에 대해서도 CPU 사이클의 낭비라는 관점에서 답할 수 있습니다.이 경우 사용자가 문자를 입력할 때까지 기다리는 동안 프로세스가 절전 모드로 전환되기 때문에 "아니오"가 됩니다.
문자가 입력된 후에만 프로세스가 웨이크업 됩니다.그러면 테스트가 발생하고 테스트가 통과되면(즉, c == ' ', 다음 문자가 입력될 때까지) 프로세스가 다시 절전 모드로 전환됩니다.공백이 아닌 문자를 입력할 때까지 이 과정이 반복됩니다.
비어있는 교정기가 마음에 안 드신다면, 그 안쪽 고리를 리팩터해서
while (c == ' ') {c = getchar();}
이것은 비교 비용이 한 번 더 들기 때문에, 루프를 하는 동안 하는 것이 더 나을 것입니다.
A while
아무것도 하지 않는 것은 아마도 나쁜 일일 것입니다.
while(!ready) {
/* Wait for some other thread to set ready */
}
OS가 제공하는 만큼 CPU를 많이 사용하기 때문에 시간을 오래 끌 수 있습니다.ready
다른 스레드가 유용한 작업을 수행할 수 있는 CPU 시간을 가로채는 false입니다.
하지만 루프가 아무것도 하지 않습니다.
while ((c = getchar()) == ' ')
{}; // skip
... 부르는 것이기 때문에getchar()
모든 반복에 있어서그러므로 다른 사람들이 동의했듯, 당신이 한 일은 괜찮습니다.
절차는 안 맞는 것 같은데 포맷이 좀 이상하네요.아무 문제 없습니다.
/* Eat spaces */
while ((c = getchar()) == ' ');
(즉, 의도적으로 시체가 없음을 나타냄)
태곳적부터 사용된 표준적인 방법은, 예를 들어 라이언스 책을 보는 것입니다.
while(condition) // Here's the whole thing
; // empty body.
사실, 일반적으로 '별도선 위의 반색' 규칙은 귀무문에 사용됩니다.예를 들어, 당신은 종종 다음을 보게 될 것입니다.
if( condition-1)
;
else if (condition-2)
stmt;
else {
// do stuff here
}
이것은 훨씬 더 흔하지는 않지만 조건-1이 매우 복잡하기 때문에 이를 부정하고 혼란을 초래하고 싶지 않거나 코드가 수명 1인치 이내에 손으로 최적화된 위치에 나타나 가장 일반적인 경우를 먼저 원할 수 있습니다.
그
while(condition) ;
형식은 노예적으로 피하는 것입니다. 왜냐하면 그것은 일반적이고 성가신 오타이기 때문입니다. 당신은 당신이 고의적으로 한 것임을 분명히 해야 합니다.괄호 비우기
while(condition){
}
또는 그 변종들은 또한 충분히 두드러지지 않거나 더 나쁜 경우 다른 오타로 이어지기 때문에 문제가 됩니다.
나는 다음을 원합니다.
while ((c = getchar()) == ' ') /* Eat spaces */;
저도 DoNothing이라는 절차를 가지고 있는 것으로 알려져 있습니다. 특히 이런 경우에 전화를 하는 것에 대해서 말이죠.당신이 정말로 아무것도 하지 않으려 한다는 것을 분명히 합니다.
존재하지 않는 루프 본체는 완벽하게 수용 가능하지만 의도적이라는 것은 매우 명확해야 합니다.
이런 코드를 써봤어요.상황이 허락한다면 사용하지 않을 이유가 없다고 생각합니다.
저는 아무 문제가 없다고 생각합니다.쓸 수 있어요, 여러 가지 상황에서 더 좋아요.
글쎄요, 사실은 아니지만 당신의 아키텍처에 따라 다릅니다.
if (dosomething()) { ; }
위의 내용은 메모리 오버헤드가 있는 로컬 스택에서 지속적으로 밀어내고 터집니다.또한 프로세서의 파이프라인을 아무런 작동 없이 플러싱할 수도 있습니다.
아직 언급되지 않은 대안:
while(condition)
(void)0;
저는 이런 식으로 루프를 쓰는 것을 정말 좋아하지 않지만, 지난 학기에 TA를 받은 적이 있습니다.
언급URL : https://stackoverflow.com/questions/445700/is-using-a-while-block-to-do-nothing-a-bad-thing
'programing' 카테고리의 다른 글
단독 개발자를 위한 최고의 연속 통합 설정(.)NET) (0) | 2023.10.09 |
---|---|
printf()가 있는 문자열 중심 맞추기 (0) | 2023.10.09 |
판다: 각 그룹의 평균으로 결측치 채우기 (0) | 2023.10.09 |
워드 프레스 헤더 탐색 목록 항목을 div로 변경 (0) | 2023.10.09 |
SQL행반납순서 (0) | 2023.10.09 |