Learn C the Hard Way
깐깐하게 배우는 C
Zed_Shaw
Learn C the Hard Way
Learn C the Hard Way
https://learncodethehardway.org/c/
깐깐하게 배우는 C
Zed_Shaw
Learn C the Hard Way
Learn C the Hard Way
https://learncodethehardway.org/c/
}
Sub:
관련:
{
C99의 미리 정의된 명칭(predefined identifier)중 하나. 각 함수 정의를 시작하는 중괄호 다음에 아래와 같은 선언이 있는 것처럼 암시적으로 선언된다.
광역_문자,wide_character - rename
광역_문자열,wide_string - rename
형식_문자열,format_string - rename
연산자,operator
{광역_문자열,wide_string - rename
형식_문자열,format_string - rename
연산자,operator
관련:
선행(precedence) - Forouzan번역서의 용어.. '우선'?
결합성(associativity)
}결합성(associativity)
{
C99의 미리 정의된 명칭(predefined identifier)중 하나. 각 함수 정의를 시작하는 중괄호 다음에 아래와 같은 선언이 있는 것처럼 암시적으로 선언된다.
static const char __func__[] = "함수 이름";따라서 다음과 같이 디버깅 시 현재 실행 중인 함수의 이름을 출력하는 데 쓸 수 있다.
if (failed) printf("Function %s failed\n", __func__);
(C: A Reference Manual 번역서 p. 48)
}
}
memory_safety의 부재 // 메모리 안전성
1. 표준 헤더 파일 ¶
C header_file
ctype.h
stddef.h
limits.h
math.h { https://everything2.com/title/math.h }
string.h { }
iso646.h
{
특정 연산자를 위한 매크로 제공
and
and_eq
bitand
bitor
compl
not
not_eq
or
or_eq
xor
xor_eq
ctype.h
stddef.h
limits.h
math.h { https://everything2.com/title/math.h }
string.h { }
iso646.h
{
특정 연산자를 위한 매크로 제공
and
and_eq
bitand
bitor
compl
not
not_eq
or
or_eq
xor
xor_eq
rel
https://everything2.com/title/ISO-646
"ISO-646 was the first attempt to standardize an international_character_set { international character set international character set international character set "international character set" }. ..."
https://everything2.com/title/ISO-646
"ISO-646 was the first attempt to standardize an international_character_set { international character set international character set international character set "international character set" }. ..."
2. scanf() ¶
값을 성공적으로 읽었으면 1,
읽지 못했으면 (%d로 숫자를 읽으려 했는데 문자가 입력되었거나 하면) 0을 돌려줌.
읽지 못했으면 (%d로 숫자를 읽으려 했는데 문자가 입력되었거나 하면) 0을 돌려줌.
scanf의 리턴 값
scanf는 값을 돌려주는데 이것이 EOF인지 검사할 수 있다.
scanf는 값을 돌려주는데 이것이 EOF인지 검사할 수 있다.
while(scanf("%d", &var) != EOF) { ... }처럼 값을 계속해서 읽는 데 쓸 수 있다.
4. C에서 난수 생성하기 ¶
난수 생성기는 stdlib.h 필요.
종자로 난수 생성하기
{
srand(seed random number) 함수를 사용.
프로토타입은
먼저 srand(time(NULL)); 을 호출. time()은 time.h 필요.
또는 어떤 정수를 넣어 호출. 일반적으로 소수,prime_number를 종자로 쓰면 더 좋은 난수열이 나온다.
{
srand(seed random number) 함수를 사용.
프로토타입은
void srand(unsigned int seed);
먼저 srand(time(NULL)); 을 호출. time()은 time.h 필요.
또는 어떤 정수를 넣어 호출. 일반적으로 소수,prime_number를 종자로 쓰면 더 좋은 난수열이 나온다.
rand()는 0에서 RAND_MAX 사이의 pseudorandom integer를 반환.
프로토타입은
RAND_MAX는 적어도 32767임.
프로토타입은
int rand(void);
RAND_MAX는 적어도 32767임.
이제 0..50 범위의 수를 추출하려면, rand() % 51을 사용하면 됨.
최소..최대 범위를 지정하려면, rand() % ((max + 1) - min) + min 식을 사용하면 됨.
}
최소..최대 범위를 지정하려면, rand() % ((max + 1) - min) + min 식을 사용하면 됨.
}
5. rand, rand48, drand48 ¶
stdlib.h
구간 [0, RAND_MAX] 사이에 있는 값을 반환.
VC++ 2010의 경우 RAND_MAX==32767임.
VC++ 2010의 경우 RAND_MAX==32767임.
대부분의 Unix시스템은 rand48계열의 난수 생성 함수를 제공한다.이라고 (C by Dissection 4e, 분석적 접근 방법, Al Kelley, Ira Pohl 저, 7명 공역)나와 있는데 VC++ 2010에서는 안되는군. linux전용인지 CHK
drand48()은 [0, 1] 사이의 불규칙적인 실수를 생성.
lrand48()은 [0, 231−1]사이의 불규칙적인 정수를 생성.
7. C 문자 입출력 함수 ¶
getchar, putchar | 표준 입출력 스트림이 대상 |
getc, fgetc, putc, fputc | 파일 포인터가 필요 |
ungetc | 파일 스트림에서만 사용 |
8.1. 방법 1 ¶
#include <time.h> start = clock(); ... stop = clock(); double duration = (double)(stop - start) / CLOCKS_PER_SEC;
8.2. 방법 2 ¶
#include <time.h> start = time(NULL); ... stop = time(NULL); double duration = (double) difftime(stop, start);
10. C에 대한 비판 ¶
매우 옳은... off-by-one_error / buffer_overflow / uninitialized_variable / '많은 상황에 대해 명시적인 오류가 전혀 발생하지 않는 것' ... 이런것들을 머릿속에서 항상 생각해야'만' robust한 C source code를 작성할 수 있다. '피곤하다'.
11. bmks en ¶
See also CPlusPlus언어
C는
* 높은 이식성 * 충분한 저수준 - 이 둘이 충돌하여 undefined_behavior 를 C99에서 새로 만들어 내기도 하였다. 이 둘은 trade-off 관계라 둘 다 완전히 없어질 일은 없을 것으로 보인다.(아마 언어 자체가 backward compatibility를 포기하지 않는 이상은. - 그럴 일이 없지만.)
* 모듈,module 라이브러리,library를 지원하는 패키지관리자,package_manager가 없다
* 높은 이식성 * 충분한 저수준 - 이 둘이 충돌하여 undefined_behavior 를 C99에서 새로 만들어 내기도 하였다. 이 둘은 trade-off 관계라 둘 다 완전히 없어질 일은 없을 것으로 보인다.(아마 언어 자체가 backward compatibility를 포기하지 않는 이상은. - 그럴 일이 없지만.)
* 모듈,module 라이브러리,library를 지원하는 패키지관리자,package_manager가 없다
그래서 single file library with minimal dependencies도 인기가 좋다. (그 중 public domain/open source 목록: https://github.com/nothings/single_file_libs )
}RENAMETHISPAGE