《 C 전문가 프로그래밍 》 독서노트의 8~11장
1. 성형 승급은char,short int와 비트 유형(signed 또는 unsigned든) 및 매거 유형이 int 또는 unsigned int로 승급되는 것을 말한다. (만약 int가 원래의 데이터를 완전하게 수용할 수 있다면 int로 승급한다. 그렇지 않으면 unsigned int로 승급한다).만약 컴파일러가 연산 결과가 일치하도록 보장할 수 있다면, 형식 향상을 생략할 수도 있다.
2. C 언어에서 매개 변수 전달도 스텔스 유형 변환이 발생할 수 있다.적당한 함수 원형을 사용하면 유형 향상이 일어나지 않고 그렇지 않으면 발생할 수 있다.호출된 함수 내부에서, 향상된 매개 변수는 원래 성명된 크기로 축소됩니다.
3. C 언어의 스텔스 유형 전환은 최초의 컴파일러를 간소화하는 생각에서 비롯된다.모든 조작수를 같은 길이로 바꾸어 코드의 생성을 크게 간소화시켰다.이렇게 하면 창고에 눌린 매개 변수는 모두 같은 길이이기 때문에 운행할 때 시스템은 매개 변수의 수량만 알고 그것들의 길이를 알 필요가 없다.
9. 수조를 재론하다
1. 배열과 포인터가 동일한 경우:
(1) 표현식의 그룹 이름은 컴파일러가 그룹의 첫 번째 요소를 가리키는 바늘로 간주한다.
덧셈과 같이 커서 조작부호를 떼어내는 조작수는 교환할 수 있기 때문에 a[10]의 성명에서 a[6]와 6[a]를 사용하는 것은 모두 정확하다. 왜냐하면 컴파일러가 모두 그것을 (a+6)로 해석하기 때문이다.
(2) 배열 아래 첨자는 항상 포인터의 편이도와 같다.
(3) 함수 매개 변수의 성명에서, 그룹 이름은 컴파일러가 이 그룹의 첫 번째 요소를 가리키는 바늘로 삼는다.
매개 변수로서의 수조와 바늘을 동일시하는 것은 효율적인 고려에서 비롯된 것이다. 왜냐하면 주소 호출이 전체 수조를 복사하는 것보다 효율이 높기 때문이다.함수 내부에서sizeof를 통해 수조의 길이를 얻을 수 없습니다. 수조가 바늘로 변환되었기 때문입니다.
2. 배열 이름은 수정할 수 없는 왼쪽 값이고 포인터의 값은 수정할 수 있습니다.
void func(int arr1[])
{
int arr2[] = {0,1,2};
int arr3[] = {0,1,2};
arr1 = arr2; // ok, arr1 has been converted to a pointer.
arr3 = arr2; // error, array's name is a left-value which can't be changed.
}
3. C 언어의 수조는 1차원 수조이고 C 언어의'다차원 수조'는 실제적으로 수조의 수조이다.
4. 바늘이 가리키는 수조의 비트가 다르면 그 자체 증가 작업의 결과도 다르다.
int parrot[2][3][5];
int (*r)[5] = parrot[0]; // ++r 4*5=20
int *t = parrot[0][0]; // ++t 4
5. 그룹을 초기화할 때 그룹의 길이가 제공한 초기화 개수보다 많으면 나머지 몇 개의 요소는 자동으로 0(원소가 int형일 경우), 빈칸(char형일 경우), 0.0(원소가 더블형일 경우), NULL(원소가 바늘형일 경우)으로 설정됩니다.만약 그룹을 성명할 때 초기 값을 제공하지 않는다면, 그룹의 요소의 값은 확정되지 않습니다.(vc6.0 환경에서 초기화되지 않은 int나 바늘의 값은 0xccccc입니다.)초기화되지 않은 포인터의 값은 NULL이 아닙니다!
10. 지침 재론
1.'수조 이름이 하나의 바늘 매개 변수로 고쳐진다'는 규칙은 귀속 정의가 아니다. 수조의 수조는 컴파일러가'수조의 바늘'이 아니라'수조의 바늘'로 고쳐진다.
char c[8][10]; /* */ char (*c)[10]; /* */
char *c[15]; /* */ char **c; /* */
char (*c)[64]; /* */ char (*c)[64]; /* */
char **c; /* */ char **c; /* */
2. 포인터를 사용하여 함수에 다차원 그룹을 전달합니다.예를 들어array[x][y]를 1차원 그룹array[x+1]로 바꾸면 원소 유형은array[y]를 가리키는 바늘이고 그룹의 마지막 요소array[x]에 NULL 바늘을 저장하여 그룹의 끝을 알린다.
3. C 언어에서는 const int 상수로 배열의 길이를 정의할 수 없고 C++는 가능합니다.
const int SIZE = 100;
char plum[SIZE]; // error in C, ok in C++
4. 라이브러리 함수realloc()는 현재 메모리 블록의 크기를 재분배할 수 있으며 원래 메모리 블록의 내용을 잃어버리지 않습니다.실천에서 리얼loc () 함수의 반환 값을 문자 포인터에 직접 부여하지 마십시오. 리얼loc () 함수가 실패하면 이 포인터의 값을 NULL로 바꾸어 기존 테이블에 접근할 수 없습니다.
11. 당신은 C를 알기 때문에 C++는 문제없다
1. C 언어는 추상적인 것을 지원하기 위해 사용자가 새로운 형식(struct,enum)을 정의할 수 있지만 C 언어는 사용자 정의 형식에서 *, <, [], + 등 미리 정의된 조작부호를 다시 정의할 수 없고, C++는 허용한다.
2. C++는 자동과 제어된 초기화, 데이터가 생명이 끝난 후에 자동으로 제거되고 스텔스 유형 전환을 제공한다.이러한 특성 중 일부는 C 언어가 지원하지 않고, 일부는 C 언어에서 매우 편리하지 않다.(?)
3. C 언어는 봉인을 실현하기 위한 완비된 메커니즘이 없다.
봉인은 데이터와 관련된 조작을 한데 묶는 것이다. 구체적으로 말하면 사용자가 정의한 데이터 구조와 사용자가 정의한 데이터 구조에서 조작할 수 있는 함수를 한데 묶어 데이터의 완전성을 실현하고 다른 함수는 사용자가 정의한 유형의 내부 데이터나 조작에 접근할 수 없다.C 언어는 프로그래머가 각종 데이터 형식을 조합하여 사용자 정의 기록 (구조체) 을 만들 수 있지만 함수를 제한할 수 없다.만약 구조가 완전히 볼 수 있다면, 그 어떤 부분도 어떤 방식으로든 수정될 수 있다.사람들은 함수를 데이터 유형에 고정시켜 명확하게 하나로 융합시킬 수 없다.
4. 유형 변환
int i = 3;
float x = (float)i; // C style
float y = float(i); // C++ style
5. C 언어에서 하나의 문장 블록에 있는 모든 성명은 모든 문장의 앞에 놓아야 하며, C++에서 성명은 문장이 나타날 수 있는 어느 곳에나 나타날 수 있다.
6. C++에서는 내부 역할 영역의 구조 이름이 외부 공간에서 같은 대상 이름을 숨기고 C 언어에서는 그렇지 않습니다.
7. C++에서 문자 상수의 형식은char이고 C 언어에서 문자 상수의 형식은 int입니다.즉 C++에서sizeof('a') = 1;C 언어에서 sizeof('a') = 4.(sizeof(int) = 4로 가정합니다.
8. C++에 새로운 주석부호가 추가되었기 때문에//, 때로는 두 언어에서 미묘하고 괴이한 차이가 발생할 수 있다.
9. C++에는 있지만 C 언어에는 다음과 같은 제한이 없습니다.
(1) C++에서 사용자 코드는main () 함수를 호출할 수 없습니다. C 언어에서 실행됩니다. (비록 이런 경우는 드물지만.)
(2) 완전한 함수 원형 성명은 C++에서 필수적이며 C 언어에서는 이렇게 엄격하지 않다.
(3) C++에서 typedef가 정의한 이름은 기존의 구조 탭과 충돌할 수 없습니다. C 언어에서는 허용됩니다. (서로 다른 이름 공간에 속합니다.)
(4)void* 바늘이 다른 종류의 바늘에 값을 부여할 때 C++는 강제 형식 변환을 해야 하며 C 언어에서는 필요없다고 규정한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.