[읽 기] C 와 포인터 (Ch4 ~ Ch7)

Chapter 4
  • if 내장 되 어 있 을 때 else 는 가장 가 까 운 불완전 if
  • 에 속한다.
  • switch 의 마지막 case 에 게 도 break 를 더 하 는 것 이 좋 은 습관 이다.
  • 사용 case 은 일반적으로 좋 은 일이 아니다. 유일한 예 외 는 다 중 순환 에서 직접 탈퇴 해 야 할 때 편리 할 수 있 지만 전체 순환 을 하나의 함수 로 포장 한 다음 에 탈퇴 해 야 할 때 직접 break 으로 해결 할 수 있다
  • .
  • C 자 체 는 어떠한 I / O 함수 와 이상 처리 능력 도 갖 추 지 못 하 는데 이런 것들 은 모두 호출 라 이브 러 리 함수 에 의 해 이 루어 져 야 한다
  • Chapter 5
  • 모드 연산 자 goto 는 부동 소수점
  • 에 사용 할 수 없습니다.
  • 마이너스 에 대해 정수 나 누 기 를 한 결 과 는 컴 파일 러 의 실현 에 달 려 있 고 0 으로 정 리 될 수도 있 으 며 마이너스 무한 으로 정 리 될 수도 있다
  • .
  • 자리 옮 김⚠️C. unsigned 값 에 대해 논리 적 으로 자 리 를 옮 기 는 것 만 규정 하고 signed 값 에 사용 하 는 자리 옮 기 는 방식 은 컴 파일 러 에 의 해 결정 합 니 다!
  • 논리 이동: 묻 지 마 세 요. 이동!좌우 에 상 관 없 이 빈자리 전 보 0
  • 산수 이동:
  • 왼쪽 이동 시 논리 이동 효과 와 같 고 결 과 는 원래 값 과 플러스 마이너스 가 다 를 수 있 으 나 이 는 넘 치 는 것 으로 간주 되 어 처리 하지 않 습 니 다
  • 오른쪽으로 이동 할 때 한 사람 만 이동 할 수 있 고 기호 위 치 는 0 이면 0 을 보충 하 며 1 이면 1 을 보충 하여 원래 값 과 같은 번 호 를 확보 합 니 다.
  • 양수 의 산수 오른쪽 이동 은 논리 오른쪽 이동 과 같 지만 음 수 는 등가 가 아니다!
  • 마이너스 부 등가

  • 순환 시 프 트: 어 셈 블 리 및 verilog 에서 사용 하 는 통 시 프 트 (bucket shift) 는 순환 시 프 트 입 니 다. 원래 값 의 0 과 1 개 수 만 변 하지 않도록 확보 합 니 다
  • ⚠️C 중의 할당 부 호 는 실제 적 으로 왼쪽 값 을 연산 결과 로 되 돌려 주기 때문에 다음 과 같은 연속 할당 은 합 법 적 입 니 다.
    int x = 3;
    int y = x = x + 2; //   
    그러나 실제 return% 이 든 아니 든 x 은 하나의 int 결 과 를 되 돌려 주 고 x + 2 에 게 할당 합 니 다. 만약 int 이 사실은 하나 x 라면.이러한 할당 은 결과 의 높 은 위 치 를 차단 할 수 있 기 때문에 얻 은 x 값 의 완전 성 은 보장 되 지 않 고 더 나 아가 char 의 값 도 기대 에 부합 되 지 않 는 다.
  • ⚠️sizeof 연산 자 는 작업 수의 유형 길 이 를 판단 합 니 다 (sizeof 는 함수 가 아 닙 니 다!!). 작업 수 (표현 식 일 수도 있 습 니 다) 의 실제 값
    //   
    sizeof(x);
    sizeof x; //       ,          x   
    //   
    sizeof(arr); //         (      !!)
    //    
    sizeof(a = b + 3); //                 ,  sizeof           ,a         
    //  sizeof                  :
    // Expression with side effects has no effect in an unevaluated context
  • 을 알 필요 가 없습니다.
  • ⚠️자증 & 자감
    + + 와 -- 정말 C 영원한 화제 입 니 다.
  • 왼쪽 값
  • 에 만 사용 가능
  • 결 과 는 값 의 복사 로 변수 자체 가 아니다.따라서 표현 식 에 자가 감소 가 나타 날 때 실제 표현 식 연산 에 참여 하 는 것 은 un - assignable 의 단순 한 값
  • 입 니 다.
    int a = 10;
    int b = a++;        //   :a                  b,  a   
    int c = (++a)++;    //   :++a   a    ,      ,        
  • 쉼표 연산 자 는 여러 표현 식 을 구분 합 니 다. 표현 식 들 은 왼쪽 에서 오른쪽으로 하나씩 값 을 구 합 니 다. 전체 쉼표 표현 식 의 값 은 마지막 작은 표현 식 의 값 과 같 습 니 다.
    유일한 용 도 는 while 순환 앞 과 내부 에 동시에 나타 나 는 문 구 를 간소화 하 는 것 일 수 있 습 니 다.while 는 매 라운드 시작 전에 조건 을 한 번 씩 수행 하기 때문이다.
  • 임의의 성형 값 에 대해 구체 적 인 값 을 명시 적 으로 테스트 하 는 것 이 불 값 으로 진 위 를 직접 판단 하 는 것 보다 낫다
  • ⚠️암시 적 유형 변환 C 의 정형 산수 연산 은 적어도 정형 유형의 정밀도 가 부족 하여 진행 된다. 모든 조작 수가 더 작은 유형 (그 렇 구나!) 이 더 라 도
    char a, b, c;
    a = b + c; //   a, b, c      char,b c       int,        int  ,         a
    연산 에 직접 참여 하 는 값 이 향상 되 지 않 는 기준 에 이 르 러 연산 결과 가 넘 칠 것 이다. 그러면 왼쪽 변 수 는 완전한 결 과 를 충분히 받 아들 일 수 있 더 라 도.얻 은 것 도 먼저 넘 치고 더 긴 값 입 니 다:
    int a, b;
    long c = a * b; //   a b      ,                 int,    c     a b   
  • 좌우 에 모두 표현 식 이 있 는 연산 자 에 대해 왼쪽 표현 식 을 먼저 계산 하 는 지 오른쪽 표현 식 을 먼저 계산 하 는 지 는 컴 파일 러 에 의 해 결정 되 기 때문에 다음 과 같은 표현 식 의 결 과 는 실제 예측 할 수 없다.
    a = ++b + --b; // C                  ,         (++b)    (--b)       
    더 좋 은 예 는 다음 과 같다.
    f() + g() - h();
    //                              ,              f()  g()
    심지어 컴 파일 러 도 작은 표현 식 을 먼저 구 한 다음 에 연산 할 수 있다.
    f() + f() * f();
    //         ,    3 f()            ,  3 f()               
  • Chapter 6
  • 포인터 가 가리 키 는 주 소 를 방문 하 는 과정 을 간접 방문 (indirection) 또는 인용 포인터 (dereferencing the pointer)
  • 라 고 합 니 다.
  • 주의 연산 자 우선 순위, 특히 인용 되 는 동시에 자감 하 는 지침 (도대체 왜 이런 코드 를 쓰 는 거 야!!)
  • 포인터 와 전체 값 의 가감 법 은 항상 가리 키 는 유형의 크기 를 단위 로 합 니 다. int 형 포인터 + 1 은 다음 int
  • 를 가리 킵 니 다.
  • ⚠️같은 배열 의 두 바늘 을 가리 키 는 결과 도 가리 키 는 유형 크기 를 단위 로 합 니 다. 이 결과 의 유형 은 ptrdiff 입 니 다.t
  • 서로 다른 배열 을 가리 키 는 지침 의 감 소 는 undefined 입 니 다. 의미 가 없 기 때 문 입 니 다
  • ⚠️표준 은 배열 요 소 를 가리 키 는 포인터 와 이 배열 의 마지막 요 소 를 가리 키 는 포인터 를 비교 할 수 있 지만, 배열 의 첫 번 째 요 소 를 가리 키 는 메모리 위 치 를 가리 키 는 포인터 와 비교 할 수 없습니다.
    이게 무슨 신선 규정 이 야?그러나 대부분의 경우 엄격하게 조사 되 지 않 아 비교 할 수 있 지만 이식 성 이 약간 떨 어 질 뿐이다

  • Chapter 7
  • 가 변 매개 변수 목록
  • x
  • 유형: y
  • 매크로: stdarg.h, va_list, va_start
  • #include 
    int sum(int argNum, ...) { //           
        va_list args;
        va_start(args, argNum); //   va_start(       +         ) args              
    
        int result = 0;
        for (int i = 0; i < argNum; i ++) {
            result += va_arg[args, int]; //   va_arg                      
        }
        va_end(args); //   va_end          
    
        return 0;
    }
  • 이 매크로 들 은 실제 매개 변수의 수량 과 유형 을 알 수 없 으 며 가 변 매개 변 수 는 실제 적 으로 부족 한 매개 변수 유형 을 향상 시 킨 다음 에 함수 에 들 어 갈 것 이 므 로 특히 조심해 야 한다
  • .

    좋은 웹페이지 즐겨찾기