관계 연산자

A == B : AB가 같으면 참(1)

A != B : AB가 다르면 참(1)

 


논리 연산자

A && B : AB 모두 참일 경우 참(1). 논리곱

A || B : AB 둘 중 하나가 참이면 참(1). 논리합

!A : A의 결과를 참이면 거짓으로

 거짓이면 참으로 반전시킨다.

 


쇼트서킷(Short-circuit)


논리합의 경우 둘 중 하나면 참이다.

따라서 왼쪽항이 참이면 

오른쪽항은 검사하지 않아도

논리합의 전체 결과는 참이다


하지만 논리곱에서는 

왼쪽항이 참인 경우에만

오른쪽항의 연산을 수행한다.

반대로 왼쪽항이 거짓이라면 

오른쪽항을 검사하지 않아도

전체결과는 거짓이 된다.


이 같은 특징으로 

논리연산자와 조합된 다른 연산식이나

조건식이 생략되는 경우를 쇼트서킷이라 한다.

불필요한 연산이 줄어들면 

프로그램의 효율이 그만큼 높아진다.

논리 연산은 무조건 왼쪽부터 시작


 

int k, x = -1, y = -1, z = 1;

k = ++x || ++y && ++z;

printf("%d %d %d %d\n", k, x, y, z); 

 

++x의 연산을 수행해서 x의 값이 0으로 변경.

‘||’연산은 논리합인 논리식이므로

두번째 항을 연산.


++y연산을 수행해서 y의 값이 0으로 변경.


‘&&’연산은 논리곱인 논리식이므로

왼쪽항이 거짓이면 

오른쪽항은 연산을 수행하지 않는다.


따라서 ++z는 수행하지 않게 되고 

값은 1에서 변하지 않는다.


‘||’연산에서 

왼쪽항 오른쪽항 모두 거짓이므로

k에 저장되는 값은 0이 된다.

따라서 0, 0, 0, 1이 출력.



int k, x = -1, y = -1, z = 1;

k = x++ || ++y && ++z;

printf("%d %d %d %d\n", k, x, y, z);


x++연산은 행의 가장 마지막에 연산을 하므로

x의 값인 -1‘||’연산을 따지게 된다

-1의 값은 참이고 ‘||’은 논리식이 논리합이므로

왼쪽항이 참이면 다음 항은 

계산을 하지 않아도 참이므로 

++y, ++z연산은 수행하지 않는다


따라서 k의 값은 참이 되고 값은 1이 된다.

따라서 1, 0, -1, 1이 출력.






** 잘못알고 있는 것이 있으면 댓글로 알려주시면 감사하겠습니다! **

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

sizeof 연산자  (0) 2018.07.02
단항 증감 연산자  (0) 2018.06.28
단순 대입 연산자  (0) 2018.06.28
비트연산자  (0) 2018.06.28
자료형, 보수와 음수표현  (0) 2018.06.14

단항 증감 연산자


1 값이 증가하거나 감소

단항 연산자가 왼쪽에 붙으면 전위(++A)

단항 연산자가 오른쪽에 붙으면 후위(A++)

전위식은 우선순위가 높으며

후위식은 우선순위가 아주 낮다.

 


++A, A++ 은

 

A += 1 또는, 

A = A + 1 로



--A, A-- 은


A -= 1 또는, 

A = A – 1 


로 설명할 수 있다.


 

int A = 0;

printf("%d\n", ++A);

 

변수 A1의 값을 더하고 

그 값을 출력한다

1의 값이 출력된다.

       


int A = 0;

printf("%d\n", A++);

printf("%d\n", A);

 

변수 A의 초기값을 먼저 출력하고

맨 마지막에 1의 값을 더하여

변수 A에 저장한다.

따라서 01을 출력.


이처럼 후위식은 해당 행의 연산이 끝나고

맨 마지막에 값의 증가가 이루어진다.






** 잘못알고 있는 것이 있으면 댓글로 알려주시면 감사하겠습니다! **

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

sizeof 연산자  (0) 2018.07.02
쇼트서킷(Short-circuit)  (0) 2018.07.02
단순 대입 연산자  (0) 2018.06.28
비트연산자  (0) 2018.06.28
자료형, 보수와 음수표현  (0) 2018.06.14

단순 대입 연산자


A = B

B 혹은 B 들어있는 값을 A 저장

메모리에 정보를 저장하는 .

기존에 저장된 값이 있다면 덮어쓰기가 됨.

대입 연산자의 왼쪽 : l-value(A)

오른쪽 피연산자 : r-value(B)

메모리의 쓰기가 일어남

l-value는 반드시 메모리일 .

 

 

ex) int A = 0;

        A = 3;

 

변수를 선언할 A 0으로 초기화.

그리고 변수 A 정수 3 대입하는 의미.

기존에 있던 0 정보는 지워지고

3 정보로 변경되어 저장됨.    

 

int A = 0 에서의

‘=’ 단순대입연산자가 아니라

변수 선언할 때의 문법상 필요에 의한 .

    비슷한 예로 ‘*’ 곱셈 연산자이지만

변수를 선언할 때는 포인터를 의미.

 



오류 코드들


1) 3 = 4;


정수형 상수 3 상수 4 저장할  없음.

l-value에는 메모리가 위치해야 .

상수는 쓰기가 허용되지 않고

또한 값을 저장할 있는 메모리도 아니다.

 


2) char Name[8];

       Name = 1;


배열의 본질은 주소이고

그 주소는 상수.

따라서 상수에는 값을 저장할 없다.

 

 

3) const : 한정어, 읽기전용화, 상수화


const int Data = 10;

Data = 20;

 

const 선언하면 해당 변수는

정보의 읽기만 있고

다른 정보를 저장할 없게 된다.

변수의 상수화가 .

10 = 20; 이라는 결과를

초래하기 때문에 오류가 발생.

 

int A = 0;

const int Data = 10;

A = Data;

 

변수 Data 상수화 하였지만

데이터의 읽기는 가능하므로

위와 같은 코드는 오류가 아니다.

변수 A 10 정보가 저장됨.

 

 

const 사용하는 이유는

메모리의 확보도 하고

정보의 훼손을 방지하기 위함.






** 잘못알고 있는 것이 있으면 댓글로 알려주시면 감사하겠습니다! **

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

쇼트서킷(Short-circuit)  (0) 2018.07.02
단항 증감 연산자  (0) 2018.06.28
비트연산자  (0) 2018.06.28
자료형, 보수와 음수표현  (0) 2018.06.14
형식 문자열 입출력 함수 ( 스캔셋 ) (3)  (0) 2018.06.07

+ Recent posts