#include <stdio.h> int main() { char ch; ch = 7; printf("\\", ch); return 0; }
프린트문에 직접 \\를 넣는 방법.
출력은 같다. 여기서 ch = 7; 은 신경안써도 된다. 7은 앞에 말했듯이 경보소리이나,
지금여기에서는 프 린트문에 %가 아닌 \\를 두개었다.

아래그림을 표와 비교해보자.
문문자열과
#include <stdio.h> int main() { printf("10진수 65: %c\n", 65 ); // A 문자 printf("16진수 40: \x40\n"); // @ 문자 printf("8진수 73: \073\n"); // 세미 콜론 printf("백슬래쉬 \\, 작은 따옴표 \', 큰 따옴표\"\n"); printf("2 bell sound \a\a\n"); return 0; }

이 출력화면을 이해하려면 아스키코드를 보고 비교해봐야 한다. 일단,
깊게 파고들지 말고 대충 이런형태로 출력이 되는 것을 이해하자.
문자열과 문자배열.
\0null이 뒤에 뭍으면 문자열이다. 다음은 "This is a string"이 메모리 형태로 저장된 그림이다.

\0이 실제로 있지만, 컴퓨터가 생략하여 실제 화면에서는 나타나지 않는다.
어차피 \0은 없다, 공백문자이다.
'a'와 "a"의 메모리를 비교하면 'a' = a
"a" = a\0이 된다. -> \0이 생략되어 있다. 어쨌든 문자열이다.
|
문자배열의 선언 프로그램.
|
#include <stdio.h> int main() { char word[30]; /*문자배열의 선언 */ printf("Please enter anything: "); scanf("%s", word); printf("%s, this is what you typed.\n", word); return 0; } |

word[30] = [30]은 30개의 공간을 만들어낸다. 제일 word[0]이 처음이고
맨 마지막이 word[29]까지이다. 저기에서 a b를 입력하였다.
a를 띄우고 b를 쓴다면, b는 출력되지 않는다. 즉, b는 저장되지 않느다.
메모리 주소로 표현하면, a\0이 저장된다. word[0]자리에 a가 들어가고
word[1] \0에 들어간다.
\0은 공백이므로 a만 출력된다. 그리고 %s의 주목. string의 약자로
%c가 한 문자만 받는데 비해 %s는 여러개의 문자를 받을 수 있다.
그래서 문자열 형수정자라고 생각하면 된다.
scanf함수에서 문자열은 &를 쓰지 않는다.
문자배열의 다른 예제. 이 예제를 보고 다시 이해하자!
#include <stdio.h> int main() { char word[30]; /*문자배열의 선언 */ printf("Please enter anything: "); scanf("%s", word); printf("%s, this is what you typed.\n", word); printf("%c\n", word[0]); printf("%c\n", word[1]); printf("%c\n", word[2]); printf("%c\n", word[3]); printf("%d\n", word[4]); return 0; }
|

word[0] ,word[1],..... 각각의 자리에 t, s,....가 저장되어
출력한다는 것을 알 수 있다.
word[4]자리에는 \0공백이 메모리에 저장되어 있으나, 화면에 출력되지 않는다.
글새서 %c로는 아무것도 나타나지 않는다. %d로 출력하여 0이 나타난다. 이것은
이자리에 공백문자 \0이 있다고 보여주기 위함이다.
연산자.

순서대로 우선순위이다.
가장 최고 높은 놈은 ()이다.
1(상수) +(연산자) num(변수); = 표현식.
단항연산자 : 1개의 항. 예) -1, a =1 단항이 아님.항이 2개.
산술연산자.
5/3 =1...... 2
%=2 나머지
/ = 1 몫
5칙연산자 중의 %와 /차이점 보기.
#include <stdio.h> int main() { char cnum1; char cnum2; cnum1 = 100%3; // '%'는 나머지 cnum2 = 100/3; // '/'는 몫 printf("나머지와 몫은 : %d %d\n", cnum1, cnum2); printf("나머지는 : %d\n", cnum1); printf("몫은 : %d\n", cnum2); return 0; }
|

위의 연산자의 숫자를 7 / 5로 바꾸어 보자. 그러면 소수는 계산이 안되고
정수만 출력될 것이다.
소수점을 출력하기 위해서는 변수 실수형인 float을 지정한다.
*두개의 연산자의 자료형인 다른 경우
char num;
int num1;
num + num1 이라면 num이 원래는char 선언되어 1바이트크기를 가지나
num1이라는 int4바이트의 우선순위의 의해서
num도 정수형으로 된다.
int, float
inum + fnum
inum = 실수형으로 변한다.
연산의 우선순위를 잘 봐야한다.
비교연산자

cnum 3<5 = 1.
3이 5보다 작다는 것은 참이다. 참이면 1. 즉, 3<5는 이 자체가 1의 값을 가진다. 거짓이면 0이다.
cnum 3<=3;이면 3=3은 같기 때문에 참의 값이 된다.1
'='는 반드시 오른쪽에 위치한다.
c에서 =<쓰면 컴파일시 오류가 뜬다!!!
cnum ==3 해석하면 cnum와 3이 같으냐?라고 묻는것이다. 같으면 참이고 다르면 거짓.
5==3; 이라면 거짓이라 0의 값을 갖는다.
!= 같지않다. 5!=3은 같지 않기 때문에 참이 된다. 굉장히 특이한 놈ㅋ
논리 연산자

&& and &(주소), &(비트논리), &&(논리)
|| or
! not
char cnum;
cnum = 1&&1; 같으니 참
cnum -100&&30은 논리 연산자에서 0이 아니면 1로 간주한다. c문법에서는!!!
그래서 -100 = 1 30 = 1이므로 둘다 1로 간주하여 참이된다.
| = shift + \누르면 된다.
(x < 10)&&(y = 5); 해석하기 x=5라고 가정.
x < 10에서 5 < 10이기 때문에 참이 된다. 그래서 x < 10자체는 1이된다.
y =5 이므로 x의 값과 같다. 따라서 참이 된다. y = 100;이라고해도 (y =5)에서 5가 y에 대입되어 영향을 미치지 못한다.
#include <stdio.h> int main() { int number; scanf("%d", &number); printf("Is number less than 10? %3d\n", number < 10); printf("Is number not equal to 10? %3d\n", number != 10); return 0; }
위 프로그램을 보면,number < 10은 10보다 작으면 참이 됨고,
아래 프린트문 10이 아니면 참이 된다.
역시 scanf문에서 조건을 만족시키는 값을 지정해주면 참값이 출력된다.
논리연산자&&(and), ||(or), !(not)
#include <stdio.H> int main() { char cnum; cnum = -100 &&30; printf("%d\n", cnum); cnum = 0||0; printf("%d\n", cnum);
cnum = !0; printf("%d\n", cnum); } |
위에서 언급했듯이 첫번째 출력은 둘 다 1이므로 1이되고 두번째 출력은 0
은 0이으로 0이된다.
or는 하나만 1이라도 참의 값이 나온다. 세번째 출력은 0이를 부정하는
부정논리이므로 0이 아닌 1이된다.

#include <stdio.h>
int main() { char cNum; char cNum2; cNum = 100; cNum2 = ++cNum; ++cNum; // cNum++; cNum = cNum +1; printf("%d\n", cNum); --cNum; cNum--; cNum = cNum -1; printf("%d\n%d\n", cNum, cNum2);
cNum2 = cNum++; printf("%d\n%d\n", cNum, cNum2); return 0; }
위의 소스를 차례대로 해석해보자.
cNum 100이 저장되는 것은 알 수있고 ++cNum이 101이 되어 cNum2에 저장된다
그리고 다시 ++cNum에 저장되고 cNum = cNum +1;에
각각 1이 저장되어 104가 출력이 된다.
다시 -- 하여 되돌아온다는 것을 알 수 있다. cNum2 = cNum++;위까지
cNum, cNum2가 각각 101의 값으로 저장되어있다.
변수 ++cNum, cNum++ 다음문법에서 차이를 보인다.
cNum2 = ++cNum;인 경우 ++cNum이 우선순위가 되어 ++cNum이
먼저 계산되고 cNum2에 대입된다. 그러나 cnum2= cnum ++;
이부분에서 우선순위가 갈린다.
cnum2에 cnum의 값이 먼저 들어가서 101이 출력되고 다음에 cnum이 ++이되어
1이 더해져 102가 된다.
이것이 뒤에 변수앞에 ++가 변수뒤 ++의 미묘한 차이이다.

|
|
#include <stdio.h> int main() { int cnum; int cnum2; cnum = 100; cnum2 = ++cnum; ++cnum; cnum++; cnum = cnum + 1; printf("%d %d\n", cnum, cnum2); --cnum; //103 cnum--; //102 cnum2 = cnum-1; // cnum = 102, cnum2 = 101 printf("%d %d\n", cnum, cnum2); return 0; }

|
자 이번에는 좀 다른게 cnum2 = cnum -1;은 cnum2 = --cnum;와는 달리 cnum-1을
연산한 값이 나온다. 그래서 출력값이 다르게 나온다.