수색…


비고

  • char 는 1 바이트가되어야하지만, 대부분의 최신 컴퓨터 플랫폼에서는 8 비트로 정의되지만 1 바이트는 8 비트 (일반적으로 옥텟 이라고도 함) 일 필요는 없습니다 . 구현의 char 당 비트 수는 <limits.h> 정의 된 CHAR_BIT 매크로에 의해 제공됩니다. POSIX 는 1 바이트가 8 비트가 필요합니다.
  • 고정 너비 정수 유형은 띄엄 띄엄 사용해야하며 C의 내장 유형은 모든 아키텍처에서 자연스럽게 설계되며 고정 폭 유형은 명시 적으로 특정 크기의 정수 (예 : 네트워킹 용)가 필요한 경우에만 사용해야합니다.

정수 유형 및 상수

부호있는 정수는 다음과 같은 유형이 될 수 있습니다 ( intshort 또는 long 은 선택 사항 임).

signed char c = 127; /* required to be 1 byte, see remarks for further information. */
signed short int si = 32767; /* required to be at least 16 bits. */
signed int i = 32767; /* required to be at least 16 bits */
signed long int li = 2147483647; /* required to be at least 32 bits. */
C99
signed long long int li = 2147483647; /* required to be at least 64 bits */

이러한 각각의 부호있는 정수 유형은 부호없는 버전을가집니다.

unsigned int i = 65535;
unsigned short = 2767;
unsigned char = 255;

char 가 아닌 모든 유형에 대해 signed 있거나 unsignedunsigned 부분이 생략되면 signed 버전이 사용됩니다. char 형은 signed charunsigned char 과 다른 세 번째 문자 유형을 구성하고 부호 (또는 부호 없음)는 플랫폼에 따라 다릅니다.

서로 다른 유형의 정수 (C 전문 용어로 리터럴 이라고 함)는 접두어 나 접미어에 따라 다른 기준과 다른 너비로 쓸 수 있습니다.

/* the following variables are initialized to the same value: */
int d = 42;   /* decimal constant (base10) */
int o = 052;  /* octal constant (base8) */
int x = 0xaf; /* hexadecimal constants (base16) */
int X = 0XAf; /* (letters 'a' through 'f' (case insensitive) represent 10 through 15) */

십진수 상수는 항상 signed 됩니다. 16 진수 상수는 0x 또는 0X 시작하고 8 진 상수는 0 시작합니다. 후자의 두 값은 값이 서명 된 유형에 적합한 지 여부에 따라 signed 되거나 unsigned 되지 않습니다.

/* suffixes to describe width and signedness : */
long int i = 0x32; /* no suffix represent int, or long int */
unsigned int ui = 65535u; /* u or U represent unsigned int, or long int */
long int li = 65536l; /* l or L represent long int */

상수 값은 적합한 제 1 타입을 갖는 접하지 않고, 즉,보다 큰 소수 상수 INT_MAX 형이고 long 가능한 경우, 또는 long long 그렇지.

헤더 파일 <limits.h> 은 다음과 같이 정수의 한계를 설명합니다. 그것들의 구현 정의 된 값은 같은 기호로 아래 표시된 것과 크기 (절대 값)가 같거나 커야한다.

매크로 유형
CHAR_BIT 비트 필드 (byte)가 아닌 가장 작은 객체 8
SCHAR_MIN signed char -127 / - (2- 7 - 1)
SCHAR_MAX signed char +127 / 2 7 - 1
UCHAR_MAX unsigned char 255 / 2 8 - 1
CHAR_MIN char 아래 참조
CHAR_MAX char 아래 참조
SHRT_MIN short int -32767 / - (2 15 - 1)
SHRT_MAX short int 32,767 / 2월 15일에서 1일까지
USHRT_MAX unsigned short int 2분의 65,535 16 - 1
INT_MIN int -32767 / - (2 15 - 1)
INT_MAX int 32,767 / 2월 15일에서 1일까지
UINT_MAX unsigned int 2분의 65,535 16 - 1
LONG_MIN long int -2147483647 / - (2 31-1 )
LONG_MAX long int +2147483647 / 2 31 - 1
ULONG_MAX unsigned long int 4294967295 / 2 32 - 1
C99
매크로 유형
LLONG_MIN long long int -9223372036854775807 / - (263 - 1)
LLONG_MAX long long int 9백22경3천3백72조3백68억5천4백77만5천8백7 / 2 63-1
ULLONG_MAX unsigned long long int 18446744073709551615 / 2 64 - 1

표현식에서 char 형의 객체의 값이 부호 확장을 사용하면 CHAR_MIN 의 값은 SCHAR_MIN 의 값과 SCHAR_MIN 하고 CHAR_MAX 의 값은 SCHAR_MIN 의 값과 SCHAR_MAX . 표현식에서 char 형의 객체의 값이 사인 확장되지 않으면 CHAR_MIN 의 값은 0이 될 것이고 CHAR_MAX 의 값은 UCHAR_MAX 의 값과 UCHAR_MAX .

C99

C99 표준은 고정 폭 정수에 대한 정의를 포함하는 새로운 헤더 인 <stdint.h> 추가했습니다. 보다 자세한 설명은 고정 너비 정수 예제를 참조하십시오.

문자열 리터럴

C의 문자열 리터럴은 리터럴 0으로 끝나는 문자 시퀀스입니다.

char* str = "hello, world"; /* string literal */

/* string literals can be used to initialize arrays */
char a1[] = "abc"; /* a1 is char[4] holding {'a','b','c','\0'} */
char a2[4] = "abc"; /* same as a1 */
char a3[3] = "abc"; /* a1 is char[3] holding {'a','b','c'}, missing the '\0' */

문자열 리터럴은 수정할 수 없습니다 (실제로 .rodata와 같은 읽기 전용 메모리에 배치 될 수 있음). 값을 변경하려고하면 정의되지 않은 동작이 발생합니다.

char* s = "foobar";
s[0] = 'F'; /* undefined behaviour */

/* it's good practice to denote string literals as such, by using `const` */
char const* s1 = "foobar";
s1[0] = 'F'; /* compiler error! */

여러 문자열 리터럴은 컴파일 할 때 연결됩니다. 즉, 이러한 구문을 작성할 수 있습니다.

C99
/* only two narrow or two wide string literals may be concatenated */
char* s = "Hello, " "World";
C99
/* since C99, more than two can be concatenated */
/* concatenation is implementation defined */
char* s1 = "Hello" ", " "World";

/* common usages are concatenations of format strings */
char* fmt = "%" PRId16; /* PRId16 macro since C99 */

문자 상수와 마찬가지로 문자열 리터럴은 다른 문자 집합을 지원합니다.

/* normal string literal, of type char[] */
char* s1 = "abc";

/* wide character string literal, of type wchar_t[] */
wchar_t* s2 = L"abc";
C11
/* UTF-8 string literal, of type char[] */
char* s3 = u8"abc";

/* 16-bit wide string literal, of type char16_t[] */
char16_t* s4 = u"abc";

/* 32-bit wide string literal, of type char32_t[] */
char32_t* s5 = U"abc";

고정 폭 정수 유형 (C99 이후)

C99

<stdint.h> 헤더는 여러 가지 고정 너비 정수 유형 정의를 제공합니다. 이러한 유형은 선택적 이며 플랫폼에 해당 폭의 정수 유형이 있고 대응하는 부호 유형이 음수 값의 2의 보수 표현을 갖는 경우에만 제공됩니다.

고정 너비 유형의 사용 힌트는 비고 섹션을 참조하십시오.

/* commonly used types include */
uint32_t u32 = 32; /* exactly 32-bits wide */

uint8_t u8 = 255;  /* exactly 8-bits wide */

int64_t i64 = -65  /* exactly 64 bit in two's complement representation */

부동 소수점 상수

C 언어에는 세 가지 필수 실수 부동 소수점 유형 인 float , doublelong double 있습니다.

float f = 0.314f;        /* suffix f or F denotes type float */
double d = 0.314;        /* no suffix denotes double */
long double ld = 0.314l; /* suffix l or L denotes long double */

/* the different parts of a floating point definition are optional */
double x = 1.; /* valid, fractional part is optional */
double y = .1; /* valid, whole-number part is optional */

/* they can also defined in scientific notation */
double sd = 1.2e3; /* decimal fraction 1.2 is scaled by 10^3, that is 1200.0 */

<float.h> 헤더는 부동 소수점 연산에 대한 다양한 제한을 정의합니다.

부동 소수점 연산은 구현이 정의합니다. 그러나 대부분의 현대 플랫폼 (arm, x86, x86_64, MIPS)은 IEEE 754 부동 소수점 연산을 사용합니다.

C에는 위의 코드에서 파생되는 3 개의 선택적 부동 소수점 유형도 있습니다.

해석 통역

C의 독특한 구문 론적 특징은 선언이 선언 된 객체를 정규 표현식과 같이 사용한다는 것입니다.

우선 순위와 연관성이 동일한 다음 연산자 집합이 선언자에서 다시 사용됩니다.

  • 포인터를 나타내는 단항 * "역 참조"연산자;
  • 배열을 나타내는 binary [] "array subscription"연산자;
  • 함수를 나타내는 (1 + n) -ary () "함수 호출"연산자;
  • 나열된 연산자의 우선 순위와 연관성을 무시하는 () 그룹화 괄호

위의 세 연산자는 다음과 같은 우선 순위와 연관성을가집니다.

운영자 상대적 우선 순위 연관성
[] (배열 구독) 1 왼쪽에서 오른쪽으로
() (함수 호출) 1 왼쪽에서 오른쪽으로
* (참조 취소) 2 오른쪽에서 왼쪽으로

선언을 해석 할 때, 식별자로부터 시작하여 위 표와 같이 올바른 순서로 인접 연산자를 적용해야합니다. 연산자의 각 응용 프로그램은 다음의 영어 단어로 대체 될 수 있습니다.

표현 해석
thing[X] 크기 X 의 배열
thing(t1, t2, t3) 함수는 t1 , t2 , t3 을 반환하고 반환 ...
*thing 포인터를 ...

영어 해석의 시작은 항상 식별자로 시작하며 선언의 왼쪽에있는 유형으로 끝납니다.

예제들

char *names[20];

[]* 보다 우선하므로 해석은 다음과 같습니다. nameschar 에 대한 포인터의 크기가 20 인 배열입니다.

char (*place)[10];

괄호를 사용하여 우선 순위를 재정의하는 경우 * 가 먼저 적용됩니다. placechar 크기 10의 배열에 대한 포인터입니다.

int fn(long, short);

여기서 걱정할 우선 순위는 없습니다. fnlong , shortint 반환하는 함수입니다.

int *fn(void);

먼저 () 가 적용됩니다. fnvoid 취하고 int 대한 포인터를 반환하는 함수입니다.

int (*fp)(void);

의 우선 순위 오버라이드 () : fp 취하는 함수에 대한 포인터 void 와 재 int .

int arr[5][8];

다차원 배열은 규칙의 예외는 아닙니다. [] 연산자는 테이블의 연관성에 따라 왼쪽에서 오른쪽 순서로 적용됩니다. arrint 크기 8 배열의 크기 5 배열입니다.

int **ptr;

두 개의 참조 취소 연산자는 동일한 우선 순위를 가지므로 연관성이 적용됩니다. 연산자는 오른쪽에서 왼쪽 순으로 적용됩니다. ptrint 대한 포인터에 대한 포인터입니다.

다중 선언

쉼표는 단일 명령문 내에서 여러 선언을 구분하기 위해 분리 기호 (쉼표 연산자와 같은 * 연산자가 아닌 *)로 사용될 수 있습니다. 다음 문은 다섯 가지 선언을 포함합니다.
int fn(void), *ptr, (*fp)(int), arr[10][20], num;

위의 예에서 선언 된 객체는 다음과 같습니다.

  • fn : void 취하고 int 반환하는 함수.
  • ptr : int 대한 포인터.
  • fp : 함수 복용에 대한 포인터 int 및 반환 int ;
  • arr : int 의 크기가 20 인 배열의 크기가 10 인 배열.
  • num : int .

대체 해석

선언은 미러 사용을 나타 내기 때문에 선언은 객체에 적용될 수있는 연산자와 해당 표현의 최종 결과 유형으로 해석 될 수 있습니다. 왼쪽에있는 유형은 모든 연산자를 적용한 후 최종 결과입니다.

/*
 * Subscripting "arr" and dereferencing it yields a "char" result.
 * Particularly: *arr[5] is of type "char".
 */
char *arr[20];

/*
 * Calling "fn" yields an "int" result.
 * Particularly: fn('b') is of type "int".
 */
int fn(char);

/*
 * Dereferencing "fp" and then calling it yields an "int" result.
 * Particularly: (*fp)() is of type "int".
 */
int (*fp)(void);

/*
 * Subscripting "strings" twice and dereferencing it yields a "char" result.
 * Particularly: *strings[5][15] is of type "char"
 */
char *strings[10][20];


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow