////////////////////////////////////
//
//  콤마에 대해서 (98.6.28) 조경민

#include <conio.h>
#include <stdio.h>

void ans(int x)
{
        printf("%d",x);
}


이상황에서
ans(2)
는 2의 출력이다.

ans( (1,2) )
는 2의 출력이다.

ans( (4,5,6) )
는 6의 출력이다.

즉 콤마는
expression1,expression2,....
이렇게 계속 명령식을 단계로 넘어가는 역활을 한다. 특히 두번째 세번째처럼
1,2가 두개의 인자가 아닌 콤마로 연결되었다는 것을 의미하기 위해서
괄호로 묶어서 의미를 정확히 해야 한다.
여기서 중요한 것은 결국 콤마의 묶음의 결과는 마지막에 남은 것이다.

콤마의 단계적인 성질을 이용한 while문

a = 0;
while( a++ , a < 3 )
{
        printf("돌아간다");
}

돌아간다.
돌아간다.

여기서 주의해서 볼 사항은 a++은 한 expression 명령표현식의 제일 마지막에
수행되지만 콤마는 한 표현식으로 보이지 않는다.(?)
따라서 a++ ,  콤마후 a는 +1이 된다. 그래서 두개만 찍힌다.


콤마를 이용한 함수 호출

void ans(int x)
{
        printf("%d",x);
}


int i=2;

ans( (i+2,i+5) );

은 7이 출력된다. 이유는 간단하다.
먼저 처음 expression인 i+2를 실행한다. 그러나 이것은 단지 수의 덧셈이지
i에 값을 복사하지는 안는다. 즉 4가 된다. 현재 상태는  4, i+5 와 같다.
다음 표현식에서 i+5 해서 7이 된다. 4, 7 이라는 것이 된것이다.
결과는 마지막의 7이므로 7 이 찍히게 된다.

int i=2;

ans( (i+2, i=1, i+3) );

이것은 4이 출력된다. i+2를 통해 4 , i=1, i+3 이된다.
두번째의 i=1은 대입이므로 i는 1이 된다. 4 , 1 , i+3
i는 1이므로 i+3은 당연히 4이다. 4,1,4 따라서 출력은 4가 된다.


그럼 종합해서 생각해보자

ans( ( 1,2-1,34,1 + (12-1)) );

이것은 어떻게 될까 12가 된다.


** 중요한 이야기 **

상수 수식표현은 컴파일 될때 컴파일러가 효율성에 의해서 무시된다.
주석이 무시되는 것과 같은 의미이다.

void main()
{
        int i;
        1,2,3,4,5,6,7,8,9,0;
        1;2;3;4;4;5;6;6;7;8;
        'a','|';'b',0x01;
        012,015,"삐삐는",0,"광통신 삐삐";        
        "무시라-_-;",/*내가 암일두/* 안/*한/*다/*구??*/
        // 뜨아~~~ 정말 그렇구나~~ 결국 난 보바다.. --+
        // 혼신의 힘을 다해서 그럼 나도 무언가 하는 !!
        i+2,i<<2,!(i*2)/2;
        if(!i>>1)012,015,016,"애용하자";
        else "else";
          
}

< 아무일도 않는 프로그램 -_-; >     // 변수선언,계산빼구


        down counting efficiency
        int a=5;

        while(a--)
        {
                printf("asdf\n");
        }
}

'KB > C/C++' 카테고리의 다른 글

몇가지 코드 최적화  (0) 2004.03.19
C++과 객체 지향  (0) 2004.03.19
예전 콜링 컨벤션  (0) 2004.03.19
재미로 보는 C/C++언어  (0) 2004.03.19
생성자 계승  (0) 2004.03.19

+ Recent posts