310 likes | 466 Views
C 언어 ( STS2008 -04). Introduction to the C Language Structure of a C Program. Identifier. ▪ Identifier ▫ Identifier 는 데이터나 객체에 부여하는 이름을 뜻함 ▪ Identifier 의 규칙 ▫ 첫 글자는 영문자나 언더스코어 (‘_’) 로 시작 ▫ 영문자 , 숫자 , 언더스코어로만 구성되어야 ▫ 처음 63 글자만 구별 가능
E N D
C 언어 (STS2008-04) • Introduction to the C Language • Structure of a C Program
Identifier ▪ Identifier ▫ Identifier는 데이터나 객체에 부여하는 이름을 뜻함 ▪ Identifier의 규칙 ▫ 첫 글자는 영문자나 언더스코어(‘_’) 로 시작 ▫ 영문자, 숫자, 언더스코어로만 구성되어야 ▫ 처음 63글자만 구별 가능 ▫ Keyword는 사용할 수 없음예) double, int, switch, if, else, return, static 등 ▪ Identifier의 예
Types ▪ A set of values and a set of operations that can be applied on those values. ▫ Void : void 타입은 값을 갖고 있지 않으며, 연산 없음 ▫ Derived : 다른 타입들로 구성된 복잡한 구조 예) pointer, enumerated type, union, array, and structure
Types ▪ Boolean Type ▫ Boolean Type은 true와 false 오직 2가지 값으로 나타냄 ▫ Boolean Type이 규정되기 전에도 integer값을 이용해 표현 ▫ True 0 이외의 수 (positive or negative) ▫ False 0 (zero) ▪ Character Type ▫ 1byte로 저장되며 하나의 문자 저장 ▫ 저장할 수 있는 문자는 alphabet문자에 한정된 것이 아니라 숫자와 기타기호도 포함 ▫ char형은 0~255의 값을 갖는 작은 int형으로 해석가능 그래서 C에서는 char형을 자주 int형과 같이 취급함 ▫ 예) char형 변수는 내부적으로는 정수형이므로 산술연산이 가능 ▫ 다음의 경우 문자 ‘A’의 다음 두 번째 문자인 ‘C’가 출력 char c = ‘A’; // c = 65 printf("%c", c+2); // c+2 = 67 => ‘C’
Types ▪ Integer Type ▫ int형은 정수를 저장 ▫ short int, int, long int, long longint로구분됨 ▫ 각각의 integer size 들은 signed 혹은 unsigned 될 수 있음 ※ 위의 표는 일반적인 값을 나타내며 플랫폼에 따라 달라질 수 있다. ▪Floating-Point Type ▫ float 형은 실수를 저장 ▫ real, imaginary, complex 로 분류됨 ▫ real type 은 float, double, long double로만 구분됨
Variables And Constants ▪ Variables ▫ 값을 저장할 수 있는 기억장소에 이름을 붙인 것으로 선언된 후 쓰여야 함 ▫ 변수를 선언할 때는 변수의 type과 변수의 이름을 나란히 써줌 ▫ 변수의 선언은 함수의 첫 부분에서만 가능 ▪ variable initialization(변수의 초기화) ▫ 변수를 초기화하지 않으면 어떤 값이 들어있는지 알 수 없음 초기화 이전에 저장되어 있는 값을 쓰레기 값(garbage)이라 함 ▪ Constants ▫ 프로그램이 실행되는 동안에 변하지 않는 데이터 값 const float pi = 3.14159
Output Formatting : printf ▪ C에서 출력을 하는 방법은 여러가지가 있지만 가장 쉽게 쓸 수 있는 것은 printf(print formatted)이다. ▪ “ ” 안에 출력할 내용을 적는다. ▪ 변수의 값을 출력할 때는 “ ” 안의 해당 위치에 형식문자(%d, %c, etc..)를 적고, “ ” 뒤에 해당하는 변수를 순서대로 적는다. printf (“ … %d … %f …“, int형변수, float형변수);
Output Formatting : printf 전체 폭은 8이며, 변환문자 f는 소수점 이하 6자리가 기본 전체 폭은 5이며, 정렬은 기본적으로 우측정렬 ▪ int형 변수 값의 출력 형식 ▫ %d 사이에 폭을 나타내는 정수를 기술 ▫ 필드 폭을 지정하면 자동적으로 우측정렬이 된다. 좌측정렬을 위해서는 필드 폭 앞에 ‘-’ 를 붙임 ▪ float형 변수값의 출력 형식 ▫ 필드 폭을 지정하려면 %f 사이에 폭을 기술 ▫ %10f 라고 기술하면 전체 폭은 10, 소수점 이하 자리수 폭은 기본 6으로 지정 ▫ %10.5f 이면 전체 폭은 10, 5는 소수점 이하 자리수의 폭을 의미 ▫ 지정한 전체 폭이 출력 값의 전체 폭보다 작으면, 지정된 작은 폭은 무시하고 원래의 출력 값의 폭으로 출력 printf(“%f”, 3.1); 전체 폭은 5이며, 정렬은 기본적으로 우측정렬, + 의미는 값의 부호 출력 3 . 1 + 0 3 3 0 0 printf(“%5d”, 30); printf(“%+5d”, 30); 3 . 1 0 0 0 0 0 전체 폭은 5이며, 소수점 이하 2자리, 정렬은 – 부호에 의해 좌측정렬 printf(“%-5.2f”, 3.1);
Output Formatting : printf ▪ 오류가 있는 output의 예 ▫Threeconversion specifications, but only two values ▫ Twoconversion specifications, with three values ▫ Format specification does not match the data type printf(“%d %d %d\n”, 44, 55); 44, 55, 134513316 (세 개의 값이 출력된다, 이때 뒤에 오는 argument의 수가 달라 match되는 값이 없어 쓰레기 값 이 출력 된다.) printf(“%d %d\n”, 44, 55, 66); 44, 55 (세 번째 값은 무시된다.) float x = 123.45; printf(“The Data are : %d\n”, x); The Data are : -1073741824 (float type에 변수를 int type으로 출력하여 잘못된 결과 값이 나온다.)
▪ C에서 입력을 받는 방법 중가장 쉽게 쓸 수 있는 것은 scanf()이다. ▫ scanf()는 도스창인 표준 입력으로부터 여러 종류의 자료 값을 입력 받을 수 있음 ▫ 사용법은 printf()와 유사 ▫ 단, 입력 값을 저장할 변수의 이름 앞에 ‘&’를 반드시 붙여줘야 한다. (&은 해당 변수의 주소를 의미하는 연산자) Input Formatting: scanf scanf(“ %d %f ”, &age, &weight);
C Programs - Comment ▪ comment는 reader가 프로그램을 이해하는데 도움을 줌 ▪ opening token: /* ▪ closing token: */ ▪ 컴파일러는 /* …… */사이의 모든 내용을 무시 ▪ 컴파일러는 // …… 다음의 한 라인의 내용을 무시 ▪ 주석 내부에 주석을 중복하여 사용하는 경우 일부는 주석처리가 되지 않는다. 이 부분만 주석으로 처리 주석처리 되지 않은 부분
Number Bases ▪ Decimal Integer ▫ 0, 237, 18567, -789 ▪ Octal Integer (0으로 시작) ▫ 017, 05643, 0234 ▪ Hexadecimal Integer (0x로 시작) ▫ 0x12FF, 0x56ABC, 0x89A345 예) unsigned int A = 0347; /*octal number 347*/ unsigned int B = 0x56A7C; /*hexadecimal number56A7C*/
0 x 3 2 F C 0 7 1 4 3 6 7 3 1 E 0 6 5 0 4 Number Conversion ▪ 2진수, 8진수, 16진수 사이의 변환 ▫ 2진수를 오른쪽에서부터 3bits로 묶어서 8진수로 변환. ex) 0111001100011110 ▫ 2진수를 오른쪽에서부터 4bits로 묶어서 16진수로 변환 ex) 0111001100011110 ▫ 8진수 하나의 숫자는 2진수의 3자리로 변환 ▫ 16진수 하나의 숫자는 2진수의 4자리로 변환 ▫ 16진수 8진수는 2진수로 변환하여 변환
Expressions ▪ 프로그램 언어에서 변수나 상수, 연산자로 구성된 식 ▪표현식은 항상 결과(반환) 값을 갖음 ▫ Operator(연산자) : +, -, *, / 등 ▫ Operand (피연산자): operator를 가지고 계산되는 상수 또는 변수
Expressions ▪ Primary expression : operator가 없이 오직 하나의 operand로 이루어진 가장 기본적인 형태 ▫ 식별자( Identifier ) ▫ 식별자 예 : a, b12, price, calc, INT_MAX 등 ▫ 상수 ( Constants ) ▫ Constants 예 : 5, 123.45, ‘A’, “Welcome” 등 ▫ 괄호식( Parenthetical Expression ) ▫ 괄호식 예 : (2*3)+4, (a=23+b*6) 등
Expressions ▪ Prefix expression ▫ 형식 : operator가 operand 앞에 나옴 ▪ Postfix expression ▫ 형식 : operator가 operand 뒤에 나옴
Expressions ▪ ++a 과 a++의 차이 ▫ prefix와 postfix는 증가/감소 연산을 수행하는 시점이 다름 ▫ prefix의 경우, 변수의 참조보다 먼저 연산을 수행 ▫ postfix의 경우, 변수의 참조 후에 연산을 수행 <prefix> <postfix> int x, a=1; x = ++a; a에 1을 더한 후, x에 그 값을 대입한다. x의값은 2가 된다. int x, a=1; x = a++; x에 값을 대입한 후, a에 1을 더한다. x의값은 여전히 1이다.
Expressions ▪ 증가연산(prefix, postfix)과 일반산술연산(infix)의 비교
Expressions ▪ 증감연산 사용 이유 ▫ 증감연산자를 이용하면 프로그램 형태가 간결 ▫ 기계어 코드와 일대일 대응되므로 실행속도가 개선 ▪ 주의점 ▫ 연산자의 위치에 따라 evaluation value가 다르므로 주의 요구 ▫ 증감연산자는 ++, --자체가 연산자 기호 중간에 공백이 들어가면 안됨 ▫ 산술연산이나 관계, 논리연산보다 그 평가를 먼저 한다. ▫ 증감연산자는 피연산자로 변수를 사용할 수 있지만, 상수나 일반 수식을 피연산자로 사용 불가능 ▫ 다음과 같은 수식은 잘못된 수식 int a = 10; ++300; /* 상수에는 증가 연산자를 사용할 수 없다 */ (a+1)--; /* 일반 수식에는 증가 연산자를 사용할 수 없다 */
Binary expression ▪ Binary expression ▫ 형식 : 피연산자– 연산자 – 피연산자(operand – operator - operand) ▫ Operator가 operand사이에 있음 ▫ Binary expression 예 ▫ a+7, 3+4, b-11 등 additive expression (+, -) ▫ 10*12, a /4, 5%2 등 multiplicative expression (*, /, %) ▫ %(modulo)는 나머지를 구하는 연산자
Assignment expression ▪ Assignment expression ▫ 수학에서는 “우측의 값과 좌측의 값이 같다”라는 의미이나, C 언어에서는 “우측의 값을 좌측의 저장 장소에 저장하라”라는 의미 ▫ 분류 ▫ simple assignment ▫ 예) a=5, b=x+1, i=i+1등 ▫ Compound assignment ▫ 예) x+=y, x*=y, x/=y 등
3 20 4 counter counter counter Assignment expression ▪ Destination of an assignment ▫ 대입 명령은 항상 대입 연산자의 오른쪽에서 왼쪽으로 Ex) A = 9; : 변수(variable) A에 값(value) 9를 대입 9 = A; : 9는 올바른 변수 이름이 아니므로 잘못된 표현 Ex) X = Y * Z; : 변수 Y와 Z를 곱한 결과값을 변수 X에 대입 X * Y = Z; : X * Y는 식별자, 즉 하나의 변수가 아닌 표현식 이므로 C 문법에 어긋난 잘못된 표현 Ex) A = B; : 변수 B가 갖는 값을 변수 A에 대입 B = A; : 변수 A가 갖는 값을 변수 B에 대입 따라서 위의 두 대입 명령문은 다른 의미를 갖는다. 같다는 표현을 하기 위해서는 “= =“ 연산자 이용! Ex) A = B = C = 0; or A = ( B = ( C = 0 )); 대입 명령은 항상 연산자의 오른쪽에서 왼쪽으로 대입되므로 위의 두 명령은 같은 의미를 갖는다. Ex) counter = 3; counter = counter + 1; counter = 5 * counter;
Precedence & Associativity ▪ Precedence : 다른 연산자들 사이의 우선 순위 ▫ 수학에서도 곱하기나 나누기 연산자가 더하기나 빼기 연산자보다도 우선 순위가 더 높은 것처럼 C언어에서도 연산자 사이에 우선순위가 있다. ▫ Precedence의 예 ▫ 2 + 3 * 4 ( 2 + ( 3 * 4 ) ) ▫ - b ++ ( - ( b++ ) ) ▪ Associativity : 같은 순위의 연산자들 사이의 우선 순위 ▫ Associativity의 예 ▫ Left-to-Right (Simple Assignment) ▫ 3 * 8 / 4 % 4 * 5 ( ( ( ( 3 * 8 ) / 4 ) % 4 ) * 5 ) ▫ Right-to-Left (Compound Assignment) ▫ a += b *=c -= 5 ( a += ( b *= ( c -= 5 ) ) ) ( a = a + ( b = b * ( c = c – 5 ) ) )
Type Conversion ▪ Type Conversion ▫ 일반적으로 C 언어의 연산식에서 여러 피연산자의자료형이 서로 다른 경우, 하나의 통일된 자료형으로 자동 변환하여 연산을 수행 ▫ Implicit type conversion (coercion) : C 컴파일러가 판단하여 자동으로 데이터형을 변형하는 경우 ▫ 다음과 같은 경우 C 컴파일러가 판단하여 자동 형 변환을 수행한다. ▫ 수식에서 데이터형이 혼합되어 사용되었을 때 값을 변환 ▫ 특정한 데이터형의 변수에 다른 데이터형의 값을 대입할 때, 값을 변환 ▫ Explicit type conversion (cast) : 프로그래머가 형 변환자(cast)를 사용하여 강제적으로 변형하는 경우
Implicit type conversion ▪ 서로 다른 데이터 형이 혼합하여 사용될 때 ▫ 수식에서 형 변환은 보통 범위가 큰 데이터형으로 변환 ▫ Conversion Rank ▫ 각각의 타입들에 대해 계급을 할당 ▫ Ex) long double 타입의 실수는long타입의 정수보다 높은 계급을 갖고 있다. “모든 문자들은 숫자 값을 가지고 있기 때문에 문자를 정수와 부동소수점 값에 더할 수 있다”
Implicit type conversion ▪ 형 확장(Promotion) ▫ 하나 이상의 데이터 형이 혼합식을 구성할 때 ▫ 가장 큰 데이터 형에 맞춰 자동으로 형 변환이 이루어지는 규칙을 적용 ch* i ch는 int형으로 확장되어 i과 계산 수행된다. 여기서 ch는 대문자 A 인데 이는 ASCII 코드값65 로 계산된다. 2) * f 1)에서계산된 결과는 float형으로 확장되어 f와 계산 수행된다. 3) + 300 300도 float형으로 확장되어 2)의 결과에 더해진다. 4) 계산의 결과는 double형으로 확장되어 d에 대입된다. <실행결과>
Implicit type conversion ▪ 범위가 큰 데이터 형에서 작은 데이터 형으로의 변환은 문제 발생
Explicit type conversion ▪ Explicit conversion ( casting, cast operation ) ▫ 프로그래머가 강제적으로 변수의 데이터형 변환 가능 ▫ 피연산자의 값을 앞 위치의 괄호 안에서 지정한 자료형으로 변환하는 연산 ( type ) expression expression의 값을 type의 데이터형으로 강제로 변환 치환문에 의한 형변환 캐스트 연산자에 의한 강제 형변환 <실행결과>
Explicit type conversion ▪ 시스템, OS (운영체제), 컴파일러의 종류에 따라 각 데이터형의 메모리 저장 크기가 다를 수 있음 ▪ 프로그램이 사용하는 데이터형의 크기를 알 수 있는 방법으로 sizeof연산자를 사용할 수 있음 (unary expression) ▫ sizeof ( type ) ▫ 위의 연산자를 사용하면 해당 데이터형의 크기를 byte 단위로 알려줌 Ex) sizeof(int); sizeof(float); cf)시스템에 따라 데이터형의 크기가 다를 수 있다는 점은, 한 환경에서 다른 환경으로 프로그램을 가져갈 때 문제를 일으킬 수 있다. sizeof() 연산자는 데이터형의 크기가 중요시 되는 프로그램에서 유용하게 사용될 수 있다.
Statements ▪ 프로그램에 의해서 수행되는 하나의 동작(action) ▪ 직접적으로 하나 또는 그 이상의 실행 가능한 컴퓨터 명령어로 변환됨 ▪Statement의 종류 ▫ Null statement ▫ ; statement가 있어야 하지만 아무런 동작도 필요하지 않을 경우 사용 ▫ loop등에서 유용하게 사용 예) for( ; ; ) ▫ Expression statements ▫ 표현식 뒤에 세미콜론(;)을 붙여 statement로 변환 ▫ ‘;’는 컴퓨터에게 statement의 끝임을 나타냄 ▫ Compound statements ▫ 0 (zero) 또는 그 이상의 문장으로 구성되는 코드 단위 : Block ▫ main 함수를 만들 때도 compound statements 사용 ▫ 세미콜론(;)이 필요하지 않음