저 세상밖으로...

문장(Statement), 수식(expression), 연산자(operator) 본문

프로그래밍/C언어

문장(Statement), 수식(expression), 연산자(operator)

열혈매미 2016. 5. 6. 16:41

:: 문장(statement) ::


  • 선행 처리기 지시어(#include, #define)를 제외하고는 항상 세미콜론 (;)으로 끝난다.
  • C언어 컴파일러는 모든 공백을 무시한다.
  • 문자열 상수 "" 내에서의 공백은 컴파일러가 그대로 받아들인다.
    • 문자열 내 줄 구분을 사용하기 위해서는 그 앞에 백슬러시(\)를 포함시켜야 한다.
printf("hello, \
world");
  • 블록(block)이라고도 하는 복합문(compound statement)은 괄호 내에 포함되어 있는 두 줄 이상의 C 문장들을 말한다.

  • {
        printf("Hello, ");
        printf("world");
    }
    


    :: 수식(expression) ::


    1.25 / 8 + 5 * rate + rate * rate / cost

    수식 내에 여러 개의 연삭자가 사용될 때는 연산자의 우선순위에 의해서 결과가 계산된다.


    다음과 같이 문장을 작성할 수도 있다.


    y = x = a + 10;

     a + 10 을  x에 넣고 이 x를 y에 넣는다.


    x = 6 + ( y = 4 + 5);

    4 + 5 의 값을 y에 넣는다. 이에 6을 더하여 x에 넣는다.



    :: 연산자(operator) ::



    C에서 모든 연산항은 수식이다. C의 연산자에는 여러 가지 종류가 있다.


    • 할당 연산자(assignment operator)
    • 산술 연산자(mathematical operator)
    • 관계 연산자(relational operator)
    • 논리 연산자(logical operator)

    할당연산자는 등호(=)이다. 다음과 같은 내용을 프로그램에 입력하면


    x = y;


    산술연산자는 덧셈이나 뺄셈고 같은 수학적 연산을 수행한다.



    단항 산술 연산자


    ++x, x++     : 연산항을 1 증가시킨다. 

    --y, y--         : 연산항을 1 감소시킨다.


    ++x;
    --y;

    이는

    x = x + 1;
    y = y - 1 ;


    이와 같다.


      단항 연상자는 연상 앞에서 사용되는 선행모드(prefix mode)와, 연산항 뒤에 사용되는 후행모드(postfix mode)가 있다. 이 둘에 대한 차이는 다음 소스가 결과를 잘 보여준다.


    /* 단항 연산자의 선행과 후행 모드 */
    
    #include <stdio.h>
    
    int a, b;
    
    main()
    
    {
    	/* a와 b에 5를 할당 */
    	a = b = 5;
    
    	/* a와 b를 감소시키며 출력 */
    	/* b를 선행글쓰기...모드(prefix mode), a를 후행모드(postfix mode) 적용 */
    
    	printf("%d	%d\n", a--, --b);
    	printf("%d	%d\n", a--, --b);
    	printf("%d	%d\n", a--, --b);
    	printf("%d	%d\n", a--, --b);
    	printf("%d	%d\n", a--, --b);
    
    	return 0;
    }

    결과는


    5        4

    4        3

    3        2

    2        1

    1        0


    이다.


    이항 산술 연상자


    C언어에는 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) 외에 나머지(%)가 있다. 첫 번째 연산항을 두번째 연상항으로 나누고 생성되는 나머지 값을 돌려주는 것이다.


    100 % 9 -> 1

    10   % 5 -> 0

    40   % 6 -> 4



    다음은 초 단위로 표현되는 값을 시간, 분, 초로 변환시키는 예제이다.


    /*
     나머지 연산자 사용의 예 
    초 단위 값을 입력하면
    시, 분, 초로 계산한다.
     */
    
    #include <stdio.h>
    
    /* 상수 정의 */
    
    #define SECS_PER_MIN 	60
    #define SECS_PRE_HOUR	3600
    
    unsigned seconds, minutes, hours, secs_left, mins_left;
    
    main()
    {	
    	/* 초단위 값 입력 */
    	printf("Enter number of seconds( < 65000: \n");
    	scanf("%d", &seconds);
    
    	hours 	= seconds / SECS_PRE_HOUR;
    	minutes 	= seconds / SECS_PER_MIN;
    	mins_left 	= minutes % SECS_PER_MIN;
    	secs_left 	= seconds % SECS_PER_MIN;
    
    	printf("%u seconds is equeal to ", seconds);
    	printf("%u h, %u m, and %u s\n", hours, mins_left, secs_left);
    
    	return 0;
    }


    연산자 우선순위 : [ ++ , -- ]  → [  *, / , % ]  → [ + , - ]


    • 왼쪽부터 우선적으로 진행 (ex. 5 * 3 + 1 : 5에서 3을 곱한 뒤 1을 더한다. 수학과 동일)
    • 동등한 레벨의 연산자의 경우 왼쪽에섭터 진행 (ex. 5 * 3 % 2 : 5에서 3을 곱한 값에서 2로 나눈 나머지를 구한다)
    • 우선순위를 지정하고 싶을 경우 괄호()를 사용하면 된다. (ex. 5 * (3 + 1) : 3과 1을 더한 값에 5를 곱한다) * 중첩괄호 사용가능

    관계 연산자

    관계 연산자 종류: [ ==, >, <, >=, <=, != ] (=> 나 =<를 적어넣으면 컴파일 에러가 뜬다)

    * C언어에서 참은 1, 거짓은 0의 값을 가진다.


    a = ( 5 == 5 )
    여기서 a의 값은 '1'이 되며

    a = ( 5 != 5 )
    여기서는 a의 값이 '0'이 된다. 그러므로

    a = ( 12 == 12) + ( 5 ! = 1 )
    첫번째 괄호가 참이므로 1, 두번째 괄호 역시 참이므로 1, 그러므로 a는 '2'의 값이 할당된다.




    관계연산자 우선순위: [ < , <= , > , >= ]  →  [ !=, == ]

     



    만약 다음과 같은 내용을 사용한다면

     x == y > z

    이는 다음과 같은 뜻이 된다.

    x == ( y > z )

    이 식에서는 먼저 y가 z보다 큰 것이 '참'인지를 확인할 것이다. 이를 통해 얻게 된 참(1) 혹은 거짓(0)의 값이 x와 동일한지를 확인할 것이다.



    논리 연산자


    논리 연산자의 종류: and (&&), or (||), not(!)


    exp1 && exp2 : exp1과 exp2가 모두 참이라야 참(1)이 된다.

    exp1 || exp2 : 둘 중 하나만 참이면 참(1)이다.

    !exp1 : exp1가 참이면 거짓(0), 거짓이면 참(1)이 된다.


    #include <stdio.h>
    
    main()
    {
    	printf("%d\n", (1 == 1) && (0 == 0));
    	printf("%d\n", (1 == 1) || (1 == 0));
    	printf("%d\n", (1 == 1) && (0 != 0));
    	printf("%d\n", ! (0 != 0));
    }

    결과는 1, 1, 0, 1 이다.



    논리 연산자를 여러개로 구성할 수도 있다.

    (x == 2) || (x == 3) || (x == 4) 


    if 연산은 0이 아니면 무조건 참이다. 가령


    x = 3;
    if (x)
            printf("%d", x);

    하게 될 경우, x는 0이 아니므로 if구문은 참으로 인식한다. 그러므로 if (x)는 if (x != 0) 을 의미한다.



    논리 연산자의 우선순위: [ !      ++ , -- ... ]   [  ==, >=, <=  ]    [ && ]    [ || ]



    때문에 명확한 논리연산 순서 지정을 위해서는 괄호가  필요할 때가 있다. 다음 소스는 서로의 값이 각각 1과 0으로 다르게 나타난다.

    #include <stdio.h>
    
    /* 변수를 초기화한다. c는 d보다 작지 않은데, 
        이런 조건을 확인할 것이다. 
        그래서 전체 수식은 거짓으로 평가된다. */
    
    int a = 5, b = 6, c = 5, d = 1;
    int x;
    
    main()
    {
    	/* 괄호 없이 수식을 평가 */
    	x = a < b || a < c && c < d;
    	printf("%d\n", x);
    		
    	/* 괄호로 수식을 평가 */
    	x = ( a < b || a < c ) && c < d;
    	printf("%d\n", x);
    	return 0;
    }
    


    다음 표식은

    x = x + 5;

    다음과 같이 간략히 표시할 수도 있다(이는 파이썬에서도 쓰이는 방법이다).


    x += 5;

    이런식으로 사용하는 것을 복합 할당 연산자라고 부른다. C언어에서는 다음과 같이 복합 할당 연산자를 사용할 수 있다.


    x *= 1   -> x = x * y

    y -= z + 1 -> y = y - z + 1

    a /= b -> a = a / b

    y += y / 8 -> x = x + y / 8

    y %= 3 -> y = y % 3



    조건 연산자


    x = y ? 1 : 100 ;

    y가 참(0이 아닐경우)일 경우 x에 1을 할당하고, 거짓(0)일 경우 x에 100을 할당한다. 같은 방법으로

    z = ( x > y ) ? x : y ;

    x와 y중 큰 값을 z에 할당하는 식이 가능하다. 이는 다음과 같은 if구문으로 표현할 수 있다.


    if (x > y )
        z = x ; 
    else
        z = y ;

    하지만 조건 연산자는 printf() 함수의 내부와 같이 if문을 사용할 수 없는 곳에서도 사용할 수 있다.


    printf("The larger value is %d", ( x > y ) ? x : y );


    쉼표 연산자


      이는 C에서 변수 선언, 함수의 인수 등을 독립적으로 구분하기 위해 사용한다.


    x = (a++, b++) ;


    연산자 우선순위


    ()    {}    ->    .
    ! ~ ++ *(간접연산자) &(주소 연산자) sizeof +(단항 연산자) -(단항연산자)
    *(곱셈연산자) / %
    + -
    << >>
    < <= > >=
    == !=
    &(비트 AND 연산자)
    ^
    |
    &&
    ::
    ?:
    = += =+ *= /+ %= &= ^= |= <<= >>=
    .
    


    [참고문헌]

    - Teach Yourself C

    '프로그래밍 > C언어' 카테고리의 다른 글

    함수(function)  (0) 2016.05.07
    변수  (0) 2016.05.06
    Comments