C puzzle(1)

7110 단어 c
C puzzle 원문 주소: http://www.gowrikumar.com/c/index.html
1. 다음 예상 출력 은 배열 array [] 의 각 요소 이 고 실제 출력 결 과 는 비어 있 습 니 다. 
  #include<stdio.h>
  #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
  int array[] = {23,34,12,17,204,99,16};
  int main()
  {
      for(int d=-1;d <= (TOTAL_ELEMENTS-2);d++)
          printf("%d
",array[d+1]); return 0; }

분석: sizeof 연산 자 는 바이트 형식 으로 연산 자의 저장 크기 를 보 여 줍 니 다. 그 중에서 작업 수 는 하나의 표현 식 이나 괄호 안에 포 함 된 유형 명, 즉 sizeof (type), sizeof (var name) 또는 sizeof var 일 수 있 습 니 다.name, 연산 자의 저장 크기 는 연산 자의 형식 에 의 해 결정 되 며, unsigned 형식 으로 되 돌아 갑 니 다. 이렇게 TOTALELEMENTS - 2 는 5 입 니 다.d 는 int 형식 으로 부호 가 없 는 TOTALELEMENTS - 2 를 비교 할 때 부호 없 는 타 입 보 호 를 하고 unsigned 타 입 으로 전환 하기 때문에 for 의 조건 은 가짜 로 판단 하고 순환 에서 벗 어 납 니 다.IEEE 의 메모리 구조 에 따 르 면 기호 양수 의 가장 높 은 위 치 는 표지 위치 로 양수, 양수 의 가장 높 은 위 치 는 0 이 고 음수 의 가장 높 은 위 치 는 1 이 므 로 바 이 너 리 를 비교 할 때 음 수 는 양수 보다 영원히 크다.
(\ # define 의 용법 은 http://blog.csdn.net/benny5609/article/details/2314541 참조)
다음 과 같이 수정 하면 실행 할 수 있 습 니 다.
          int m=TOTAL_ELEMENTS-2;
          for(int d=-1;d <= m;d++)
             printf("%d
",array[d+1]);

 아직도 몰라!!!꼬 임 T0T...
 ========================================================================
2. 실행 할 수 없 음:
 
void OS_Solaris_print()
{
        printf("Solaris - Sun Microsystems
"); } void OS_Windows_print() { printf("Windows - Microsoft
"); } void OS_HP-UX_print() { printf("HP-UX - Hewlett Packard
"); } int main() { int num; printf("Enter the number (1-3):
"); scanf("%d",&num); switch(num) { case 1: OS_Solaris_print(); break; case 2: OS_Windows_print(); break; case 3: OS_HP-UX_print(); break; default: printf("Hmm! only 1-3 :-)
"); break; } return 0; }

 원인: 변수 이름 은 알파벳, 숫자 와구성, 그리고 첫 번 째 문 자 는 알파벳 이 어야 합 니 다!!
===========================================================================
3. contine 은 for, while, do - while 문 구 를 사용 하여 다음 순환 을 시작 합 니 다. while 와 do - while 문 구 는 contine 이 테스트 부분 을 즉시 실행 하 는 것 을 의미 합 니 다.for 순환 에서 제어 가 순환 변수 부분 으로 이동 하 는 것 을 의미 합 니 다.contine 은 순환 문 에 만 사용 되 며 switch 문 구 는 사용 되 지 않 습 니 다.
break 문 구 는 for, while, do - while 등 순환 에서 미리 종료 하 는 데 사 용 됩 니 다.break 는 프로그램 을 switch 문장 이나 가장 안쪽 순환 에서 바로 뛰 어 나 오 게 할 수 있다.
===========================================================================
4. 프로그램 출력 "hello - out"
 
  #include <stdio.h>
  #include <unistd.h>//VS     ,  <windows.h> Sleep()  
  int main()
  {
          while(1)
          {
                  fprintf(stdout,"hello-out");
                  fprintf(stderr,"hello-err");
                  sleep(100);
          }
          return 0;
  }
 프로그램 이 hello - outhello - err 를 연속 으로 출력 하여 자동 으로 전 환 됩 니 다.
 
stdout -- 표준 출력 장치 (printf ("...");stderr -- 표준 오류 출력 장치.둘 은 기본적으로 화면 으로 출력 합 니 다.
그러나 디스크 파일 에 전향 표준 으로 출력 하면 차이 점 을 알 수 있다.stdout 은 디스크 파일 로 출력 하고 stderr 는 화면 에 있 습 니 다.사용법:
fprintf(stderr, "Can't open it!");
fprintf(stdout, "Can't open it!");
========================================================================
5. 다음 프로그램 실행 결 과 는 12 입 니 다.  f(1,2) 
 
  #include <stdio.h>
  #define f(a,b) a##b
  #define g(a)   #a
  #define h(a) g(a)

  int main()
  {
          printf("%s
",h(f(1,2))); printf("%s
",g(f(1,2))); return 0; }

        여기 서 매크로 의 전개 순 서 를 말 해 야 합 니 다. 만약 에 매크로 에 인자 가 있다 면 f (a, b) 중의 a 와 b 는 우 리 는 형 삼 이 라 고 부 릅 니 다. 매크로 의 실제 매개 변 수 는 우 리 는 실제 인삼 이 라 고 부 릅 니 다. 예 를 들 어 f (1, 2) 중의 1 과 2 등 입 니 다.매크로 의 전 개 는 매우 복잡 한 과정 이지 만 다음 과 같은 세 단계 로 간단하게 설명 할 수 있다.
먼저 실제 인삼 으로 형 삼 을 교체 하고 실제 인삼 을 매크로 텍스트 에 대 입 합 니 다.
그리고 실 삼 도 홍 이 라면 실 삼 을 펼 칩 니 다.
마지막 으로 매크로 교체 후의 매크로 텍스트 를 계속 처리 합 니 다. 매크로 텍스트 에 도 매크로 가 포함 되 어 있 으 면 계속 펼 쳐 집 니 다. 그렇지 않 으 면 펼 쳐 집 니 다.
    그러나 예외 가 있 습 니 다. 그것 은 첫 번 째 단계 에서 실제 인삼 을 매크로 텍스트 에 대 입 한 후에 실제 인삼 을 만 나 기 전에 문자 '\ #' 또는 '\ # #' 를 만나면 실제 인삼 이 매크로 라 고 하 더 라 도 실제 인삼 을 펼 치지 않 고 텍스트 로 처리 하 는 것 입 니 다.a \ # \ # b 는 연결 을 표시 하고 결 과 는 ab; \ #a 는 따옴표 를 표시 하고 결 과 는 'a' 이다.
===========================================================================
 6. 특정한 수의 바 이 너 리 중 1 의 개 수 를 계산 하고 프로그램 은 다음 과 같다.
 
  int CountBits (unsigned int x )
  {
      static unsigned int mask[] = { 0x55555555,
          0x33333333,
          0x0F0F0F0F,
          0x00FF00FF,
          0x0000FFFF
          } ;
          int i ;
          int shift ; /* Number of positions to shift to right*/
          for ( i =0, shift =1; i < 5; i ++, shift *= 2)
                  x = (x & mask[i ])+ ( ( x >> shift) & mask[i]);
          return x;
  }

 이분법.논리 분석 참고 http://wjboy49.iteye.com/blog/695395
==========================================================================
7. fun (void) 과 fun () 의 차이 점:
   C + + 에 서 는 함수 fun 이 어떠한 인자 도 받 아들 이지 않 음 을 나타 내 고 fun (a) 는 컴 파일 할 수 없어 서 오 류 를 보고 합 니 다.C 에서 fun (void) 을 정의 하면 fun (a) 는 컴 파일 할 수 없어 서 오 류 를 보고 하고 fun () 을 정의 하면 fun (a) 는 컴 파일 하여 실행 할 수 있 습 니 다.
============================================================================
8. 다음 프로그램 출력 은 0  1095237632
  int main()
  {
   float a = 12.5;
   printf("%d
", a); printf("%d
", *(int *)&a); return 0; }

 원인:% d 는 10 진 정수 로 인쇄 합 니 다.%6d 는 10 진 정수 에 따라 최소 6 글자 너비 로 인쇄 합 니 다.%f. 부동 소수점 에 따라 인쇄 하기;%6f 부동 소수점 에 따라 인쇄 합 니 다. 최소 6 글자 너비;%.2f 부동 소수점 에 따라 인쇄 하고 소수점 뒤에 두 개의 소수 가 있 습 니 다.%6.2f 부동 소수점 에 따라 인쇄 하고 최소 6 글자, 소수점 뒤에 두 개의 소수 가 있 습 니 다.
 
 
 

좋은 웹페이지 즐겨찾기