C에서 아무런 동작도 하지 않는 라인을 만들때 어떤 방법을 쓰는게 좋은가요?

superkkt의 이미지

#include <stdio.h>
 
int
main(void)
{
    int i = 1;
 
    if (i == 1)
        printf("1\n");
    else
        ; /* do nothing */
 
    return 0;
}

위 코드에서 else 부분에서 아무런 동작도 하지 않게하기위해 어떤 방법을 쓰는게 좋은가요? 일단 위와 같이 세미콜론 하나만 사용하니 별다른 경고는 안나오네요. 전에는 (void *) 0;를 사용했는데 이건 경고가 나오더라구요.

세벌의 이미지

아무런 동작도 안 하게 하려면 아무 것도 안 쓰면 됩니다. 위의 예에서 아예 else 도 쓰지 않고 ; 도 쓰지 않으면 되죠.
그리고 if 또는 else 조건 안에 한 줄만 있으면 { } 생략해도 되긴 합니다만 두 줄 이상이 들어갈 때는 { } 를 꼭 써야 합니다. 위의 예에서는 { } 쓰나 마나 마찬가지이지만 프로그램 수정 과정에서 if 또는 else 안에 내용을 더 넣고 { } 안 쓰면 나중에 찾기 어려운 에러가 날 수 있습니다.

#include <stdio.h>
 
int
main(void)
{
    int i = 1;
 
    if (i == 1){
        printf("1\n");
    }
    else {
        ; /* do nothing */
    }
    return 0;
}

http://sebul.sarang.net/
ironiris의 이미지

저는 개인적으로 괄호를 사용합니다.
쓰고나니 세벌님과 같네요.

전웅의 이미지

> 전에는 (void *) 0;를 사용했는데 이건 경고가 나오더라구요.
>

(void) 0;

을 의도하신 것 아닐까요?

(void *) 0

의 경우 void * 형의 null pointer 를 만들기에 이 값이 사용되지
않고 무시된다는 경고를 받게 될 가능성이 큽니다.

장난 좀 치려면

(void) "월급 좀 올려주삼";
(void) "야근 좀 줄여주삼";

과 같은 센스도 --;;;;;

if 문의 then 이나 else 파트의 문장이 단문일 경우 {} 를 써주느냐의
문제는 스타일의 문제입니다. 전사나 팀 차원의 스타일 가이드가 있다면
따라야겠으나 개인적인 프로그램의 경우 자기 스타일대로 해도 무방
하다고 봅니다.

개인적으로는 단문일 경우 {} 를 써주지 않는 것을 (경험상 가독성에서
더 유리해) 선호합니다.

--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

superkkt의 이미지

(void) 0;

맞습니다. 이거 쓸라고 했던건데 (void *) 0;으로 햇갈렸네요. 전웅님 책에서 본 기억이 있는것 같은데 지금 책이 없어서..^^

그리고 저도 if/else 문에서 단문일 경우에 원래는 괄호를 사용했었는데 쓰지 않는것이 가독성 향상에 도움이 된다고 느껴서 요즘은 일부러 빼고 사용합니다.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

jachin의 이미지

글 보다가 커피가 코로 나왔습니다. ^*^;;;;
====
( - -)a 이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.

letsbemax의 이미지

int main(void)
{
    int i = 1;
 
    if (i == 1)
        printf("1\n");
    else
       ("do nothing");  /*이렇게 쓰면 잘못 된건가요? */
 
    return 0;
}

익명사용자의 이미지

수행되지 않으면서, 경고도 안 뜨고, 메모리 좀 적게 잡아먹고, 가독성이 *가장* 좋은 코드를 찾는 과정이겠죠...
그리고 보통 세미콜론만 쓰게 되는 경우가 소스 수정하다가 어쩌다 보니 임시로 만들게 되는 과정이 대부분이니, 짧게 쓸 수 있는 게 번거롭지 않겠죠..

Hyun의 이미지

요런거... 조심해야 합니다...

if( a == 1 )
{
    functiona();
}
else;
{
    functionb();
}

;만 쓰시다 보면.. 요렇게 잘못쓴 경우... 버그찾기 정말 짜증납니다... ;가 눈에도 잘 안보이고 해서... functionb()는 항상 호출되죠..

JungJoohwan의 이미지

#define DO_NOTHING ;
위와 같은 매크로를 정의해서 사용하면 수행되지 않으면서, 경고도 안 뜨고, 메모리 좀 적게 잡아먹고, 가독성이 좋은 코드에 가깝지 않을까요??

정태영의 이미지

do { } while(0);

컴파일러가 코드를 최적화 하는 과정에서 조용히 날라갈 코드입니다 ;)

-----
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

ㅡ,.ㅡ;;의 이미지

전이렇게 하는데..ㅡ,.ㅡ;;

#include <stdio.h>
int main(void)
{
    int i = 1;
    if( i == 1 )printf("1\n");
 
    return 0;
}


----------------------------------------------------------------------------

전웅의 이미지

한가지 기억할 사실은

if (exp)
   statement;

자체가 exp 가 거짓일 때는 "아무 것도 수행을 안 한다"는 것입니다 - 이미
세벌님이 이 부분을 지적하셨죠.

따라서 null statement 를 포함하는 else 부분이 필요한 경우는 특별히
주석을 달아주는 경우 뿐인데, 이 경우라면 ; 만 적어주어도 주석과 같은
줄에 있다면 못보고 넘어 가거나 잘못 수정할 확률이 크게 줄게 됩니다.

if (something)
   statement;
else
   ;   /* blah blah ... */

null statement 가 필요한 또 다른 문맥 중 하나는 필요한 side effect 가
모두 loop 의 conditional expression 안에서 끝나 loop body 가 할 일이
없기 때문에 loop body 를 비워주는 경우입니다.

while (*s++)   /* find end of the string */
   ;

보통 이와 같은 경우에도 ; 를 독립된 줄에 써 혹시나 발생할지 모르는
가독성 문제를 방지하거나 혹은 다음과 같이 무의미한 continue 문을 써
주기도 합니다 - continue 문이 유용한 경우 중 하나입니다.

while (*s++)
   continue;

하지만, 이와 같은 방식이 모두 맘에 들지 않는 경우 애초부터 loop body
가 반드시 loop 의 main side effect 를 포함해야 한다는 가이드라인을
따르면 됩니다.

while (*s)
   s++;

그 외에 위에서 나온 null statement 를 가독성을 위해 어떻게 표현할 것
인가는 역시나 스타일 문제에 불과합니다.

단,

#define DO_NOTHING ;

의 경우 습관상

if (exp)
   statement;
else
   DO_NOTHING;

과 같이 쓰기 쉬우므로 (중첩된 if-else 문을 생각해 보시기 바랍니다)
차라리

#define DO_NOTHING

으로 정의하는게 나을 것 같습니다.

또한,

(void)0;
(void)"";

과 같은 형태는 유의미한 side effect 를 포함하지 않는 문장이기에 최적화
과정에서 깔끔하게 사라지는 것이 일반적입니다 (단, 제가 만든 토이
컴파일러에서는 지워주지 않습니다 ;-). 따라서 "메모리"에 대한 걱정이
있을 필요는 없습니다.

--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

nohmad의 이미지

if (0)
    0;
else
    1;

$ruby.is_a?(Object){|oriented| language} #=> true
http://rubykr.org

litdream의 이미지

1; 에 한표.

삽질의 대마왕...

삽질의 대마왕...

익명사용자의 이미지

코딩 하다가 문득 주석 처리해야 되겠다고 생각된 부분이 있는데,
그게 조건문의 유일한 실행문이면...
;
하나로 처리하기엔 좀 걸리죠.. 워닝 뜨고 나중에 오타 칠 가능성도 좀 있고...
그렇다고 그런 일 있을 때마다 일일이 define 문 선언해 주는 것도 좀 그렇고요요..;
true나 false를 써주는 것도 나아 보입니다.

if (1)
true;
else
false;

if (b)
NULL == NULL;
else
NULL != NULL;

의미 좀 부여해 주면서 나중에 수정할 부분이란 걸 나타낼 수도 있지 않을까요?

전웅의 이미지

> 코딩 하다가 문득 주석 처리해야 되겠다고 생각된 부분이 있는데,
> 그게 조건문의 유일한 실행문이면...
> ;
> 하나로 처리하기엔 좀 걸리죠.. 워닝 뜨고 나중에 오타 칠 가능성도 좀 있고...

; 는 null statement 라는 전통적인 이름도 가지고 있습니다. 그만큼
오래된 사용처를 갖는 방법입니다. 예를 들어, goto 문을 위한 label 은
항상 문장에 붙도록 되어 있습니다. 하지만, goto 로 이동하려는 지점이
블록의 마지막 부분이라면 label 이 붙을 문장이 없게 됩니다. 이런 경우

   {
       ...
       if (cond) goto label;
       ...
       label:
       ;
   }

와 같이 작성하는 것은 오래된 관례입니다 - 아마도 거의 모든 C 언어
책에서 이를 설명하고 있으리라 생각합니다. 그럼에도 null statement 자체
에 경고를 내는 컴파일러가 매우 바람직하다고 보기는 어렵습니다. 더구나
null statement 에 경고를 내는 컴파일러가 1; 이나 0; 같은 부분에 경고를
내지 않는 것도 일관적으로 보이지 않습니다.

꼭 경고를 내야 한다면, null statement 혹은 그와 유사한 형태의 무의미한
문장이 반복문이나 if, else 문과 동일한 줄에 오는 경우에 경고를 내주면
사소한 실수를 피하는데 도움을 줄 수 있지 않을까 생각합니다. (물론,
이는 모두 QoI issue 이긴 합니다.)

> 그렇다고 그런 일 있을 때마다 일일이 define 문 선언해 주는 것도 좀 그렇고요요..;
> true나 false를 써주는 것도 나아 보입니다.

C 언어(C99 이전)에서는 true/false 를 위한 #define 선언이 결국은 또
필요하게 됩니다. 스타일 이야기가 나오고 있으므로 제가 선호하는 스타일을
말씀드리면, C 언어에서는 (C99 환경이 아닌 이상) 절대
true/false/TRUE/FALSE 등을 enum 이나 매크로로 정의하지 않는 것입니다.
이로 인한 문제를 겪어 보신 분들은 사소한 문제가 얼마나 사람을 성가시게
할 수 있는지 이해하실 겁니다.

> if (b)
> NULL == NULL;
> else
> NULL != NULL;
>
> 의미 좀 부여해 주면서 나중에 수정할 부분이란 걸 나타낼 수도 있지 않을까요?

역시나 *제* 스타일에서는 주석이 해야 할 일입니다.

if (girllib_is_pretty(this_girl))
    /* TODO: lock the girl and release my girl friend */ ; 
else
    return;    /* to my girl friend */

--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

lovewar의 이미지

전 아래와 같이 사용합니다. 주석은 혼동을 피하기 위해서 사용합니다.

   if (a == 10) {
         doFunc();
   }
   else {
          /* do nothing */
   }

서지훈의 이미지

while (0)

이걸 적당한 메크로로 싸시면 안전하게 사용하실 수 있습니다.
이디에 박아나두 별다른 문제 없습니다.
이게 NOP 정도나 될려나.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <beer.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

전웅의 이미지

[꼬진 인터넷 땜에 중복 투고되어 하나 날립니다]

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

전웅의 이미지

사용자가 실수를 하면 안전하지 않습니다.

/* test.c */
#define NOP while(0)
 
...
 
if (cond)
    NOP    /* To be revised */
 
{    /* logical unit */
    int some_variable;
    ...
    printf("Very very important output: %d\n", some_variable);
    ...
}
puts("End!");
 
$ gcc test.c
$ a.out
End!

사용자가 절대 실수를 하지 않는다면? 그렇다면 굳이 잘 보이게 매크로로
정의할 일도 없겠지요.

--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.