검색결과 리스트
다 모여라에 해당되는 글 199건
- 2014.03.17 20140317 (break, continue, switch, debug)
- 2014.03.14 20140314 (for, if, 삼항연산자)
- 2014.03.13 20140313 (while, do while, 중첩 while)
- 2014.03.12 20140312 (리터럴 상수, 접미사, 아스키코드, 캐스팅, 서식문자, 특수문자)
- 2014.03.11 20140311 (비트연산자, 상수, 변수, const, sizeof)
- 2014.03.10 20140310 (scanf, 16진수 10진수, 실수)
- 2014.03.07 20140307 (2의 보수법, 관계, 논리 연산자)
- 2014.03.06 20140306
- 2014.03.05 20140305 (C언어 시작)
- 2014.03.04 20140304 (cl 환견변수 등록)
글
20140317 (break, continue, switch, debug)
21일차
---------------------
break, contine
---------------------
- break
반복문에서 빠져나가는 제어문
- continue
반복문을 계속 진행하는 제어문
ex) 예제 소스
#include <stdio.h>
int main()
{
int iNum;
// 30에서 50사이 값 입력
while(1)
{
printf("30에서 50사이 값을 입력하세요 : ");
scanf("%d", &iNum);
if(30 > iNum)
{
continue;
}
if(50 < iNum)
{
continue;
}
break;
}
printf("입력하신 값은 %d입니다. \n", iNum);
return 0;
}
예제 소스를 보면 continue가 실행되면
그 밑에 명령은 실행하지 않고 바로 반복문 맨 위로 간다.
break를 만나면 그 밑에 명령도 실행하지 않고
반복문을 빠져나간다.
for ( ; ; )
{
if( )
{
break;
++iNum; // 절대 실행되지 못 할 코드
}
if( )
{
continue;
++iNum; // 절대 실행되지 못 할 코드
}
}
---------------
switch
---------------
- if문과 유사하다
switch ( 정수형 변수 )
{
case 상수형 정수:
break;
case 상수형 정수:
break;
default:
break;
}
사용법은 위와 같다. 참고로 default에는 break;를 안 넣어 줘도 되지만
왠만하면 보기 좋게? 넣으면 좋겠다.
ex) 예제 소스
#include <stdio.h>
int main()
{
int iNum;
printf("숫자를 입력하세요 : ");
scanf("%d", &iNum);
switch(iNum)
{
case 1:
printf("1을 입력하셨습니다. \n");
break;
case 2:
printf("2를 입력하셨습니다. \n");
break;
case 3:
printf("3을 입력하셨습니다. \n");
break;
case 4:
printf("4를 입력하셨습니다. \n");
break;
case 5:
printf("5를 입력하셨습니다. \n");
break;
default:
printf("왜 %d를.... \n", iNum);
break;
}
return 0;
}
if문과 비슷하다.
허나 다른점이 있는데 아래 소스를 보자.
#include <stdio.h>
int main()
{
int iNum = 0; //초기화를 꼭 해줘야 합니다.
printf("문자를 입력하세요 : ");
scanf("%c", &iNum);
switch(iNum)
{
case 'A':
case 'a':
printf("A?!! \n");
break;
case 'B':
case 'b':
printf("B?!! \n");
break;
case 'C':
case 'c':
printf("C?!! \n");
break;
case 'D':
case 'd':
case 'E':
case 'e':
case 'F':
case 'f':
printf("DEF중에 하나 \n");
break;
default:
printf("잘했어요! \n");
break;
}
return 0;
}
위에서 보면 A를 입력시 그냥 case 'a'로 넘어가서
A, a 중 아무거나 입력하면 같은 결과가 나온다!!
또 이건 여담으로 int iNum을 0으로 초기화 해주지 않으면
scanf("%c", &iNum); 에서 쓰래기값과 함께 겹쳐버린다는 것!!
예를 들어 iNum에 처음 쓰래기값으로 20122359라는 정보가 저장 되어있었다면
scanf("%c", &iNum); 로 문자하나 크기 (1byte) 만 입력 받기 때문에 A (65) 입력시
20122365 로 나오기 때문에 초기화를 잊지 말아야 한다.
- if 문과 switch 문 비교
#include <stdio.h>
int main()
{
int iScore;
printf("점수를 0~100 중 입력하세요\n : ");
scanf("%d", &iScore);
switch(iScore/10)
{
case 10:
case 9:
printf("점수 : A \n");
break;
case 8:
printf("점수 : B \n");
break;
case 7:
printf("점수 : C \n");
break;
case 6:
printf("점수 : D \n");
break;
default:
printf("점수 : F \n");
break;
}
/*
if(90 <= iScore)
{
printf("점수 : A \n");
}
else if(80 <= iScore)
{
printf("점수 : B \n");
}
else if(70 <= iScore)
{
printf("점수 : C \n");
}
else if(60 <= iScore)
{
printf("점수 : D \n");
}
else
{
printf("점수 : F \n");
}
*/
return 0;
}
같은 결과가 나온다
어떤 구간에 대한 ( 3 < x < 100 ) 것은 if 문이 좋고
정확한 몇개의 값에 대한 ( 3, 4, 5, 6 ) 것은 switch 문이 유리하다.
------------
debug
------------
컴파일에서 잡지 못하는 오류를 잡을때 쓴다.
break point를 걸면 건 곳에서 프로그램이 멈춘다.
그리고 디버깅을 시작.
한 줄씩 실행이 가능하고 프로시저 단위로도 실행 가능하다.
보시다 시피 변수의 값이 변하는 것을 추척할 수 있다.
그리고 조사식1이 선택되어 있는데 지역을 보는 것을 추천한다.
조사식은 내가 보고 싶은 것만 추척하여 볼 수 있다.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140319 (포인터, little endian, big endian, 포인터 연산) (0) | 2014.03.19 |
---|---|
20140318 (포인터, &, *, (int *) ) (1) | 2014.03.18 |
20140314 (for, if, 삼항연산자) (0) | 2014.03.14 |
20140313 (while, do while, 중첩 while) (0) | 2014.03.13 |
20140312 (리터럴 상수, 접미사, 아스키코드, 캐스팅, 서식문자, 특수문자) (0) | 2014.03.12 |
글
20140314 (for, if, 삼항연산자)
20일차
---------------
for 문
---------------
- 반복문이다.
for ( 초기식 ; 조건 ; 반복식 )
{
명령
}
이런 형태이고 재미있는 것은 초기식과 반복식에
다중으로, 생략으로 선언이 가능하다.
ex) 예제 소스
#include <stdio.h>
int main()
{
int iNum1;
int iNum2;
int iNum3;
// - 5 명령이 한 줄일 경우 중괄호 생략 가능
for(iNum1 = 0, iNum2 = 0 ; 5 > iNum1 ; iNum1 = iNum1 + 1, iNum2 = iNum2 + 2)
printf("iNum1 = %d\tiNum2 = %d \n", iNum1, iNum2);
// - 4
iNum1 = 0;
iNum2 = 0;
while( 5 > iNum1 )
{
printf("iNum1 = %d\tiNum2 = %d \n", iNum1, iNum2);
iNum1 = iNum1 + 1;
iNum2 = iNum2 + 2;
}
// - 3
iNum1 = 0;
iNum2 = 0;
for( ; 5 > iNum1 ; )
{
printf("iNum1 = %d\tiNum2 = %d \n", iNum1, iNum2);
iNum1 = iNum1 + 1;
iNum2 = iNum2 + 2;
}
// - 2
iNum2 = 0;
for(iNum1 = 0 ; 5 > iNum1 ; iNum1 = iNum1 + 1)
{
printf("iNum1 = %d\tiNum2 = %d \n", iNum1, iNum2);
iNum2 = iNum2 + 2;
}
// - 1
for(iNum1 = 0, iNum2 = 0 ; 5 > iNum1 ; iNum1 = iNum1 + 1, iNum2 = iNum2 + 2)
{
printf("iNum1 = %d\tiNum2 = %d \n", iNum1, iNum2);
}
return 0;
}
1, 2, 3, 4, 5번은 다 같은 식이다.
int main()
{
unsigned int uiCnt = 0;
// while(1)
for( ; ; ) // 조건을 생략하면 무한루프가 된다
{
printf("%u \n", uiCnt); // %u = unsigned int
++uiCnt;
}
return 0;
}
또 while문과 같이 프로그래머의 의도하에 위와 같이 무한루프도 가능하다.
--------------------
if문 (흐름의 분기)
--------------------
- 흐름을 분기하는 제어문
if ( 조건 )
{ A }
이런 형태이고 조건이 참이면 괄호의 A를 실행하고
거짓이면 그냥 넘어간다.
그리고 밑에 한 명령만 할 경우 괄호를 생략 가능한데
가독성에 도움을 주기 위해 왠만하면 붙여주자.
ex)예제 소스
#include <stdio.h>
int main()
{
int iOpt;
double dNum1;
double dNum2;
printf("1.덧셈 2.뺄셈 3.곱셈 4.나눗셈 \n");
printf(" : ");
scanf("%d", &iOpt);
printf("연산하실 두 숫자 입력 \n : ");
scanf("%lf %lf", &dNum1, &dNum2);
if(1 == iOpt)
printf("%.3lf + %.3lf = %.3lf \n", dNum1, dNum2, dNum1 + dNum2);
if(2 == iOpt)
printf("%.3lf + %.3lf = %.3lf \n", dNum1, dNum2, dNum1 - dNum2);
if(3 == iOpt)
printf("%.3lf + %.3lf = %.3lf \n", dNum1, dNum2, dNum1 * dNum2);
if(4 == iOpt)
printf("%.3lf + %.3lf = %.3lf \n", dNum1, dNum2, dNum1 / dNum2);
return 0;
}
- if ( 조건)
{ A }
else
{ B }
이것은 앞서 배웠던 if문에 else가 붙었는데
조건이 참일 경우 A ,
조건이 거짓일 경우 B 를 실행한다.
ex) 예제 소스
#include <stdio.h>
int main()
{
int iNum;
printf("숫자를 입력하세요 : ");
scanf("%d", &iNum);
if(0 < iNum)
{
printf("%d 는 0보다 큽니다 \n", iNum);
}
else
{
printf("%d 는 0보다 작습니다 \n", iNum);
}
return 0;
}
- if ( 조건 )
{ A }
else if ( 조건 )
{ B }
else
{ C }
이건 조건이 여러개일 경우 위와 같이 갔다 붙이면 된다.
ex) 예제 소스
#include <stdio.h>
int main()
{
int iOpt;
double dNum1;
double dNum2;
printf("1.덧셈 2.뺄셈 3.곱셈 4.나눗셈 \n : ");
scanf("%d", &iOpt);
printf("두 개의 실수 입력 : ");
scanf("%lf %lf", &dNum1, &dNum2);
if(1 == iOpt)
{
printf("%.3lf + %.3lf = %.3lf \n", dNum1, dNum2, dNum1 + dNum2);
}
else if(2 == iOpt)
{
printf("%.3lf - %.3lf = %.3lf \n", dNum1, dNum2, dNum1 - dNum2);
}
else if(3 == iOpt)
{
printf("%.3lf * %.3lf = %.3lf \n", dNum1, dNum2, dNum1 * dNum2);
}
else if(4 == iOpt)
{
printf("%.3lf / %.3lf = %.3lf \n", dNum1, dNum2, dNum1 / dNum2);
}
else
{
printf("Error!! \n");
}
return 0;
}
이것 같은 경우 처음 if문 예제소스와 같은 기능인데
처음 if문의 경우 일일이 if문 조건을 만날 때마다 다 확인하고
넘어가지만
else if문의 경우 참인 조건을 만나면 명령을 실행하고
한 방에 다 빠져나가버린다
그러니 if문을 여러개 쓰는 것 보다 효율이 좋다.
또한 조건을 넣을 때 가능하면 확률이 가장 높은 순서대로
위에서부터 나열해 오면 더 높은 효율을 볼 것이다.
--------------
삼항연산자
--------------
- 조건 ? A : B
if문과 똑같은 역할을 한다.
참이면 A
뻥이면 B
그냥 예제를 보자
ex) 예제 소스
#include <stdio.h>
int main()
{
int iNum;
printf("숫자를 입력하세요 \n :");
scanf("%d", &iNum);
/*
// if문을 쓴 경우
printf("입력하신 숫자는 100보다 ");
if(100 < iNum)
{
printf("큼");
}
else
{
printf("작습");
}
printf("니다. \n");
*/
// 삼항 연산자를 쓴 경우
printf("입력하신 숫자는 100보다 %s니다 \n", 100 < iNum ? "큼" : "작습" );
return 0;
}
if 문과 삼항연산자의 속도는 똑같다
다만 그 안에 들어가는 명령어에 따라
삼항연산자가 훨씬 좋은 효율을 낼 경우가 있다.
자주는 쓰지 말되 위와 같은 상황에만 쓸 것.....
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140318 (포인터, &, *, (int *) ) (1) | 2014.03.18 |
---|---|
20140317 (break, continue, switch, debug) (0) | 2014.03.17 |
20140313 (while, do while, 중첩 while) (0) | 2014.03.13 |
20140312 (리터럴 상수, 접미사, 아스키코드, 캐스팅, 서식문자, 특수문자) (0) | 2014.03.12 |
20140311 (비트연산자, 상수, 변수, const, sizeof) (0) | 2014.03.11 |
글
20140313 (while, do while, 중첩 while)
19일차
-----------------
제 어 문
(반 복 문)
-----------------
-------
while
-------
반복시키는 제어문이다.while(조건) //조건이 참일 경우 아래 중괄호 실행, 거짓이면 탈출.
{
(명령문)
}
ex) 예제 소스코드
#include <stdio.h>
int main()
{
int iNum = 0;
while(5 > iNum) // 처음에 iNum이 0이므로 조건이 참이다
{
printf("Hello World! \n");
++iNum; // iNum을 증가시켜 1이 되고 다시 조건으로 올라가고
} // 조건이 거짓이 될 때까지 반복한다.
return 0;
}
결과 화면
- 순서도
- while 문 조건은 참, 거짓으로 판별하기 때문에
참이면 1을, 거짓이면 0을 나타내므로
0을 제외한 나머지 값은 다 참으로 인식한다.
while( 1 ) // 조건이 계속 참이므로 무한 반복.
{
// 명령
}
while( -1 ) // 이것도 조건이 0이 아니니 참이므로 무한 반복
{
// 명령
}
while( 0 ) // 조건이 0이므로 거짓이므로
{ // 괄호 안에 명령은 절대로 실행되지 않는다.
// 명령(세계 정복)
}
------------
do while문
------------
while문과 똑같지만 하나가 다르다while문은 조건을 검사하고 괄호 내용을 실행하지만
do while문은 우선 괄호 안을 먼저 실행하고 조건 확인 후
계속 실행할지 여부를 판단한다.
do
{
명령
} while(조건);
한가지 빼먹지 말아야 하는 것은 while(조건) 뒤에 꼭 " ; "을 붙여줘야 된다.
ex) 예제 소스 코드
#include <stdio.h>
int main()
{
int iNum;
int iTotal;
iTotal = 0;
iNum = 0;
do
{
iNum = iNum + 2;
iTotal = iTotal + iNum;
} while(100 > iNum);
printf("%d \n", iTotal);
return 0;
}
결과 화면
2550
또 생각해야 할 것이 while문과 다르게 먼저 실행을 한 번하고 나서 반복하니
조건을 기입할 때 한 번 실행했다는 것을 생각하고 조건을 대입해야 한다.
-----------
중첩 while
-----------
while 문을 중첩 시킨 것인데 음....
그냥 밑에 예제를 보자.
#include <stdio.h>
int main()
{
int iCnt1;
int iCnt2;
iCnt1 = 0;
while(5 > iCnt1)
{
iCnt2 = iCnt1;
while(0 < iCnt2)
{
printf("O");
--iCnt2;
}
printf("* \n");
++iCnt1;
}
return 0;
}
출력 화면
필요에 따라 몇 번이고 중첩 시키면 되는데
중첩을 시키면 시킬수록 헷갈리게 되니 생각을 잘해서 쓰는게 좋겠다.
오늘 배운 마지막은 순서도인데 아까 위에서 보았던 그것이다.
나중에 쓸 일이 생길거라고 꼭 알아두시라고 알려주셨다
순서도를 소스코드로 만들 줄 알아야 하고
소스코드도 순서도로 만들 줄 알아야 한다.
작성하기 쉬운 프로그램으로는 엑셀과 파워포인트이고
여기서 작성한 도형들?을 복사해서 그림판에 그대로 붙여 넣을 수 있다.
예제)
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140317 (break, continue, switch, debug) (0) | 2014.03.17 |
---|---|
20140314 (for, if, 삼항연산자) (0) | 2014.03.14 |
20140312 (리터럴 상수, 접미사, 아스키코드, 캐스팅, 서식문자, 특수문자) (0) | 2014.03.12 |
20140311 (비트연산자, 상수, 변수, const, sizeof) (0) | 2014.03.11 |
20140310 (scanf, 16진수 10진수, 실수) (0) | 2014.03.10 |
글
20140312 (리터럴 상수, 접미사, 아스키코드, 캐스팅, 서식문자, 특수문자)
18일차
----------------------
리터럴(Literal) 상수
----------------------
- 변수가 아닌 것 상수를 리터럴 상수라 함.
ex) int iNum = 3; // 여기서 3이 리터럴 상수.
- int형으로 저장 가능한 것은 int형으로 약속하고
- double형으로 저장 가능한 것은 double형으로 저장하기로 약속했다.
----------------
접 미 사
----------------
- (리터럴) 상수 뒤에 써주는 것으로 상수의 자료형을 바꿀 수 있음.
확인 예제 소스
#include <stdio.h>
int main()
{
printf("3 \t: %d \n", sizeof 3);
printf("3LL \t: %d \n", sizeof 3LL);
printf("3.14 \t: %d \n", sizeof 3.14);
printf("3.14F \t: %d \n", sizeof 3.14F);
return 0;
}
출력 화면
---------------------
아스키코드 (ASCII)
---------------------
- 영문자를 표기하기 위해 아스키코드 표를 만들어 그에 상응하는
숫자를 글자 형태로 출력시 영문자가 출력된다.
예제 소스코드
#include <stdio.h>
int main()
{
char cCh1 = 'A';
char cCh2 = 65;
char cCh3 = 'Z';
char cCh4 = 90;
printf("%c %d \n", cCh1, cCh1);
printf("%c %d \n", cCh2, cCh2);
printf("%c %d \n", cCh3, cCh3);
printf("%c %d \n", cCh4, cCh4);
return 0;
}
출력 화면
따라서 문자도 컴퓨터 내에선 숫자로 취급한다.
- 0부터 31까지는 제어문자
- 65 = 'A' - 90 = 'Z' - 97 = 'a' - 122 = 'z'
- 문자열이 아닌 문자 하나만 쓸 경우 char 형 말고 int 형으로 쓰는 것이
더 빠르다. 왜냐하면
-------------------
캐 스 팅 Casting
-------------------
- 묵시적 형변환
컴파일러가 어떠한 언급도 없이 형변환
두 가지로 나뉜다.
- down casting(하향식 형변환)
서로 크기가 안 맞을 경우 맞지 않는 부분 만큼 버림.
ex)
int iNum;
char cNum;
iNum = 257.9;
cNum = iNum;
이와 같이 소스를 짜면 iNum에는 257, cNum에는 1이 들어간다.
iNum에서는 뒤에 소수를 버리고 cNum은 257이 이진수로 1 0000 0001인데
1byte만 가져가므로 0000 0001 만 들어감.
- up casting(상향식 형변환)
데이터의 손실을 막기 위해 범위가 더 큰쪽으로 맞춘다.
ex)
dNum = 1 + 1.4;
1도 double형으로 바뀌어 1.4와 연산되어 dNum에 들어간다.
- 명시적 형변환
프로그래머가 알려서 바뀌는 것
ex)
int iNum1 = 3;
int iNum2 = 4;
double dNum;
dNum = (double)iNum1 / iNum2;
() 괄호는 casting 연산자라 부르고
결국 iNum1이 double형으로 승격하고
묵시적 변환으로 iNum2도 double형으로 승격되어 계산됨.
---------------------------
printf 서식 문자와 특수 문자
---------------------------
추가로 %출력은 %%이다.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140314 (for, if, 삼항연산자) (0) | 2014.03.14 |
---|---|
20140313 (while, do while, 중첩 while) (0) | 2014.03.13 |
20140311 (비트연산자, 상수, 변수, const, sizeof) (0) | 2014.03.11 |
20140310 (scanf, 16진수 10진수, 실수) (0) | 2014.03.10 |
20140307 (2의 보수법, 관계, 논리 연산자) (0) | 2014.03.07 |
글
20140311 (비트연산자, 상수, 변수, const, sizeof)
17일차
-------------
비트연산자
-------------
비트 연산자 종류는
| OR 조건 하나가 참일 때 참
& AND 조건 둘 다 참일 때 참
^ XOR 두 조건이 서로 반대일 때 참
~ TILDE 비트 반전
<< LEFT SHIFT 왼쪽으로 비트 이동
>> RIGHT SHIFT 오른쪽으로 비트 이동
가 있다.
아래 예제 소스코드를 보자.
#include <stdio.h>
int main()
{
int iNum1;
int iNum2;
int iNum3;
// OR
iNum1 = 0xB;
iNum2 = 0x4;
iNum3 = iNum1 | iNum2;
printf("OR : 0x%X\n\n", iNum3);
// AND
iNum1 = 0xB;
iNum2 = 0x4;
iNum3 = iNum1 & iNum2;
printf("AND : 0x%X\n\n", iNum3);
// TILDE
iNum1 = 0xFFFFFFF0;
iNum2 = !iNum1;
iNum3 = ~iNum1;
printf("iNum1 : 0x%08X\n", iNum1);
printf("iNum2 : 0x%08X\n", iNum2);
printf("iNum3 : 0x%08X\n\n", iNum3);
// XOR
iNum1 = 0xB;
iNum2 = 0x6;
iNum3 = iNum1 ^ iNum2;
printf("XOR : 0x%X\n\n", iNum3);
// right SHIFT
iNum1 = 0x18 >> 1;
iNum2 = iNum1 >> 1;
iNum3 = iNum2 >> 2;
printf("iNum1 : 0x%X\n", iNum1);
printf("iNum2 : 0x%X\n", iNum2);
printf("iNum3 : 0x%X\n\n", iNum3);
// left SHIFT
iNum3 = iNum3 << 3;
printf("iNum3 : 0x%X\n", iNum3);
return 0;
}
실행 결과
결과물에 위에 iNum2 : 0x00000000은 ~와 !가 헷갈려서
넣어서 비교해 보았다.
여기서 SHIFT 연산자를 좀 자세히 보기로 하였다.
아래 소스코드
#include <stdio.h>
int main()
{
signed int iNum;
unsigned int uiNum;
//
iNum = 0xFFFFFFFF;
uiNum = 0xFFFFFFFF;
printf("1\n");
printf("iNum : 0x%X\n", iNum);
printf("uiNum : 0x%X\n", uiNum);
printf(" >> 1\n");
iNum = iNum >> 1;
uiNum = uiNum >> 1;
printf("iNum : 0x%X\n", iNum);
printf("uiNum : 0x%X\n", uiNum);
//
iNum = 0x82345678;
uiNum = 0x82345678;
printf("\n2\n");
printf("iNum : 0x%X\n", iNum);
printf("uiNum : 0x%X\n", uiNum);
printf(" >> 1\n");
iNum = iNum >> 1;
uiNum = uiNum >> 1;
printf("iNum : 0x%X\n", iNum);
printf("uiNum : 0x%X\n", uiNum);
//
iNum = 0x72345678;
uiNum = 0x72345678;
printf("\n3\n");
printf("iNum : 0x%X\n", iNum);
printf("uiNum : 0x%X\n", uiNum);
printf(" >> 1\n");
iNum = iNum >> 1;
uiNum = uiNum >> 1;
printf("iNum : 0x%X\n", iNum);
printf("uiNum : 0x%X\n", uiNum);
//
iNum = 0x72345678;
uiNum = 0x72345678;
printf("\n4\n");
printf("iNum : 0x%X\n", iNum);
printf("uiNum : 0x%X\n", uiNum);
printf(" << 1\n");
iNum = iNum << 1;
uiNum = uiNum << 1;
printf("iNum : 0x%X\n", iNum);
printf("uiNum : 0x%X\n", uiNum);
//
iNum = 0x82345678;
uiNum = 0x82345678;
printf("\n5\n");
printf("iNum : 0x%X\n", iNum);
printf("uiNum : 0x%X\n", uiNum);
printf(" << 1\n");
iNum = iNum << 1;
uiNum = uiNum << 1;
printf("iNum : 0x%X\n", iNum);
printf("uiNum : 0x%X\n", uiNum);
return 0;
}
실행 결과
여기서 변수 앞에 signed, unsigned를 붙여서 연산한 결과가
다르게 나온다는 것을 볼 수 있다.
>> 오른쪽 SHIFT로 비트를 움직일 경우
1번과 2번의 결과를 통해
signed는 맨 앞에 부호비트로 인식?해서 맨 앞자리는 계속 1(음수)을 채워 넣고
unsigned는 명령하는 대로 움직이는 것을 볼 수 있다.
하지만 3번과 4번, 5번을 통해
signed의 맨 앞자리가 0일 경우(양수) unsigned와 같은 결과를 보고
<< 왼쪽 SHIFT로 비트를 움직일 경우
둘 다 명령처럼 움직이는 것을 볼 수 있다.
* 따라서 SHIFT연산을 할 경우 원하는 값대로 나오게 하려면
unsigned를 붙여야 한다. 또 컴퓨터 내에서 unsigned가 더 빠르다
-------------------
상수와 변수, const
-------------------
const는 변수를 상수화 시키는 것이다.
오직 읽기만 가능하기에 반드시 선언시에 초기화를 해야한다.
아래는 const상수 실습 소스코드.
#include <stdio.h>
int main()
{
int iNum = 3;
const int ciNum = 100;
iNum = 100;
// ciNum = 1000;
printf("%d\n", ciNum);
return 0;
}
위에 ciNum = 1000;을 넣으면 l-value Error가 뜬다.
iNum = 100;
=을 중심으로 왼쪽은 l-value (Left Value),
오른쪽은 r-value (Right Value)라고 부른다.
-------
sizeof
-------
변수나 상수 등 크기를 측량하는 연산자.
지금까지 sizeof()가 뒤에 괄호가 붙으니 함수인지 알았는데
연산자였다.... 괄호는 우선순위만 정해주는 역할이었다.. 충격..
아래는 실습 소스코드
#include <stdio.h>
int main()
{
int iNum;
printf("char : %d\n", sizeof(char));
printf("short : %d\n", sizeof(short));
printf("int : %d\n", sizeof(int));
printf("long : %d\n", sizeof(long));
printf("long long : %d\n", sizeof(long long));
printf("float : %d\n", sizeof(float));
printf("double : %d\n", sizeof(double));
printf("long double : %d\n", sizeof(long double));
// printf("sizeof 3.5 : %d\n", sizeof 3.5 );
// printf("sizeof iNum + 3 : %d\n", sizeof iNum + 3);
return 0;
}
출력 화면
왼쪽은 MS-DOS VC++로 실행한 결과이고
오른쪽은 Linux gcc에서 실행한 결과이다.
변수의 크기는 컴파일러 마다 다르기 때문에
새로운 컴파일러를 사용시 꼭 확인해야 한다.
그리고 아래는 sizeof가 함수가 아니라 연산자라는 것을 확인한 것이다
위에 소스에서 주석 처리한 부분을 실행한 결과다.
결과 화면과 같이 sizeof 는 연산자였다.......
그리고 실수를 넣었을 때에 컴파일러 마다 float일지 double형일지는
이것도 확인해 봐야 한다고 한다.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140313 (while, do while, 중첩 while) (0) | 2014.03.13 |
---|---|
20140312 (리터럴 상수, 접미사, 아스키코드, 캐스팅, 서식문자, 특수문자) (0) | 2014.03.12 |
20140310 (scanf, 16진수 10진수, 실수) (0) | 2014.03.10 |
20140307 (2의 보수법, 관계, 논리 연산자) (0) | 2014.03.07 |
20140306 (0) | 2014.03.06 |
글
20140310 (scanf, 16진수 10진수, 실수)
16일차
-----------
scanf 함수
-----------
scanf("서식문자", &변수);
여기서 &기호는 나중에 포인터 나올 때에 다시 배우기로 하고
우선 scanf 함수 내에 변수 앞에는 무조건 붙인다.
---------------
16진수와 10진수
---------------
보통 프로그램 만들 때에는 10진수를 사용하지만
임베디드는 주로 16진수를 사용한다고 한다.
위에 그림과 같이 LED에 불을 킨다면 한 자리당 그 해당하는 LED 스위치를
담당한다고 한다. 0이 켜지는 것이라고 하셨다.
그래서 소스에
int iSwitch = 0x05; // 0101 (2) == 0x05 (16)
이런 식으로 표현될 것이라고 하심.
----------
실 수
----------
실수 구조 ( IEEE 754 )
- 오늘 알게된 것 중 주관적으로 가장 중요한 것이라고 생각하는 것이
cpu내에서 실수는 정수보다 훨씬 느리다. 가급적이면 정수를 사용할 것.
정수가 메모리에 저장되는 구조와 실수가 저장되는 구조가 다르고 실수가 훨씬 어렵다
-실수 변수 사용 예
#include <stdio.h>
int main()
{
float fNum;
fNum = 3.0/2; /* 여기서 잿수와 피잿수 중 하나라도 실수가 아니면
정수로 계산하여 실수형태로 저장하기 때문에 둘 중 하나는
반드시 실수형태여야 한다. */
printf("%f\n", fNum); // 실수는 %f 로 사용.
return 0;
}
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140312 (리터럴 상수, 접미사, 아스키코드, 캐스팅, 서식문자, 특수문자) (0) | 2014.03.12 |
---|---|
20140311 (비트연산자, 상수, 변수, const, sizeof) (0) | 2014.03.11 |
20140307 (2의 보수법, 관계, 논리 연산자) (0) | 2014.03.07 |
20140306 (0) | 2014.03.06 |
20140305 (C언어 시작) (0) | 2014.03.05 |
글
20140307 (2의 보수법, 관계, 논리 연산자)
15일차
------------------------------------------
Magnitude 방식과 2'Complete(2의 보수법)
------------------------------------------
unsigned 붙은것과 안 붙은것
2의 보수법을 취하는 것을 보는 소스다.
#include <stdio.h>
int main()
{
unsigned char cNum1;
char cNum2;
cNum1 = 127;
cNum2 = 127;
printf("%d %d\n", cNum1, cNum2);
cNum1 = 128;
cNum2 = 128;
printf("%d %d\n", cNum1, cNum2);
cNum1 = 129;
cNum2 = 129;
printf("%d %d\n", cNum1, cNum2);
cNum1 = 255;
cNum2 = 255;
printf("%d %d\n", cNum1, cNum2);
return 0;
}
출력 화면
------------------
관계, 논리 연산자
------------------
#include <stdio.h>
int main()
{
int iNum1;
int iNum2;
int iNum3;
int iNum4;
int iNum5;
int iNum6;
int iNum7;
int iNum8;
int iNum9;
int iNum10;
iNum1 = 6 > 5;
iNum2 = 6 > 7;
iNum3 = 7 == 6;
iNum4 = !3;
iNum5 = 7 != 6;
iNum6 = 7 <= 7;
iNum7 = 7 && 6;
iNum8 = 8 || 0;
iNum9 = 100;
iNum10 = 7 || (++iNum9);
printf("iNum1 = %d\n", iNum1);
printf("iNum2 = %d\n", iNum2);
printf("iNum3 = %d\n", iNum3);
printf("iNum4 = %d\n", iNum4);
printf("iNum5 = %d\n", iNum5);
printf("iNum6 = %d\n", iNum6);
printf("iNum7 = %d\n", iNum7);
printf("iNum8 = %d\n", iNum8);
printf("iNum9 = %d\n", iNum9);
printf("iNum10 = %d\n", iNum10);
return 0;
}
출력화면
여기서 재미있는게 있는데
바로 iNum9의 값이다.
원래 예상대로라면 101이 나와야 하지만 100이 나왔다.
왜냐하면 cpu에서도 일을 적게하려 하기에 || (or) 을 실행 시
앞의 조건이 참이면 뒷 조건은 실행하지 않는다.
반대로 앞 조건이 거짓이면 뒷 조건을 실행한다.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140311 (비트연산자, 상수, 변수, const, sizeof) (0) | 2014.03.11 |
---|---|
20140310 (scanf, 16진수 10진수, 실수) (0) | 2014.03.10 |
20140306 (0) | 2014.03.06 |
20140305 (C언어 시작) (0) | 2014.03.05 |
20140304 (cl 환견변수 등록) (0) | 2014.03.04 |
글
20140306
14일차
C프로그래밍을 배움.
Windows 환경과 Linux 환경을 비교해가며 배움.
Linux에서도 cc 사용 가능.(cc를 쓰면 자동으로 gcc를 사용하도록 되있다고 한다.)
- printf("\n");
ms-dos에서는 프로그램을 실행하고 명령입력창?( C:\>_ )을 띄울 때
라인피드와 캐리지 리턴을 실행하는 반면,
linux에서는 프로그램을 실행하고 명령입력창?( [id@server path] _ )을 띄울 때
캐리지 리턴만 하는 것 같다.
그래서 마지막 printf() 함수에서 \n개행문자를 안 넣어주면
결과 값이 다르게 나온다는 것을 보았다.
오늘 배운 것 중에 유심히 본 것이 일의 순서에 대하여 언급하신 것인데
나중에 임베디드 프로그래밍을 할 때에 저렇게 완다갔다 하는 시간을
줄여서 최적화하는데 한 몫하지 않나 싶다. 아직은 잘 모르니 앞으로 유심히 봐야 할 것.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140310 (scanf, 16진수 10진수, 실수) (0) | 2014.03.10 |
---|---|
20140307 (2의 보수법, 관계, 논리 연산자) (0) | 2014.03.07 |
20140305 (C언어 시작) (0) | 2014.03.05 |
20140304 (cl 환견변수 등록) (0) | 2014.03.04 |
20140303 (0) | 2014.03.03 |
글
20140305 (C언어 시작)
13일차
컴파일 : C언어에서 기계어로 바꾸는 과정
***.c ----> ***.i ----> ***.s(asm) -----> ***.o(obj) ----> ***.(exe)
(소스파일) 전처리 컴파일 어셈블리 링크
- int : 반환하는 값의 형식
- main : Entry Point 라고 진입점. 프로그램이 시작할때 처음 진입하는 함수.
- () : 조건부로 보면 되는데 인수가 들어간다. 이건 나중에 배울 예정.
- { } : main 처럼 함수의 끝과 시작.
- return : 반환하라는 의미로 함수의 종료를 뜻한다.
- 0 : 반환하는 값을 0으로 주는데, 프로그래머의 재량으로 아무 값이나 주면 되는데
c표준으로 0을 쓰면 아무 문제 없이 잘 끝났다는 의미로 사용.
- ; : 세미콜론으로 한 명령이 끝 날 때마다 사용. 명령어 구분.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140307 (2의 보수법, 관계, 논리 연산자) (0) | 2014.03.07 |
---|---|
20140306 (0) | 2014.03.06 |
20140304 (cl 환견변수 등록) (0) | 2014.03.04 |
20140303 (0) | 2014.03.03 |
20140228 (리눅스 디렉토리 종류, vi편집기) (0) | 2014.02.28 |
글
20140304 (cl 환견변수 등록)
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140306 (0) | 2014.03.06 |
---|---|
20140305 (C언어 시작) (0) | 2014.03.05 |
20140303 (0) | 2014.03.03 |
20140228 (리눅스 디렉토리 종류, vi편집기) (0) | 2014.02.28 |
20140227 (마인트 스톰 실습) (0) | 2014.02.27 |