프로그래머 들 은 C 언어의 이런 세부 사항 을 모른다.

12784 단어 C 언어세부 사항
문제 가 디 테 일이 라 고 했 으 니 디 테 일 을 소개 하 는 것 이 얼마나 재 미 없 는 지 먼저 구덩이 에 빠 뜨 린 다음 에 자세히 소개 하 자.헤헤.바로 7 문제 로 가자.네가 몇 문 제 를 맞 출 수 있 는 지 볼 까?
컴 퓨 팅 디 테 일
①:

#include <stdio.h>
int main()
{
	char a = 3;
	char b = 127;
	char c = a + b;
	printf("   :%d",c);
	return 0;
}
이 문제 의 답안 이 얼마 인지 생각해 보 세 요.일단 뒤에 있 는 거 보지 마 세 요.
정 답 은-126,헤헤,틀린 거 아니 야?우선 조급해 하지 말고 다음 문 제 를 계속 보 세 요.
②:

#include <stdio.h>
int main()
{
	char a = 0xb6;
	short b = 0xb600;
	int c = 0xb6000000;
	if(a==0xb6)
		printf("a");
	if(b==0xb600)
		printf("b");
	if(c==0xb6000000)
		printf("c");
	return 0;
}
이 문제 의 답 이 무엇 인지 생각해 보 세 요.일단 뒤에 있 는 거 보지 마 세 요.
정 답 은 c,헤헤,또 틀린 거 아니 야?서 두 르 지 말고 뒤에 있 는 문 제 를 봐.
③:

#include <stdio.h>
int main()
{
	 char c = 1;
	 printf("%u
", sizeof(c)); printf("%u
", sizeof(+c)); printf("%u
", sizeof(-c)); return 0; }
이 문제 의 답 이 무엇 인지 생각해 보 세 요.일단 뒤에 있 는 거 보지 마 세 요.
정 답 은 1,4,헤헤,또 틀린 거 아니 야?서 두 르 지 말고 뒤에 문제 봐.
표현 식 세부 사항
①:

#include <stdio.h>
int main()
{
	 int c = 3;
	 int ret = c + --c;
	 printf("%d",ret);  
	 return 0;
}
이 문제 의 답 이 무엇 인지 생각해 보 세 요.일단 뒤에 있 는 거 보지 마 세 요.
답 은 5 나 4, 입 니 다.헤헤,또 틀 렸 나 요?서 두 르 지 말고 다시 보 세 요.
표제
②:

int main()
{
	 int i = 10;
	 i = i-- - --i * ( i = -3 ) * i++ + ++i;
	 printf("i = %d
", i); return 0; }
이 문제 의 답 이 무엇 인지 생각해 보 세 요.일단 뒤에 있 는 거 보지 마 세 요.
답 은 여러 가지 가 있 습 니 다.서로 다른 컴 파일 러 의 결과 가 다 릅 니 다.즉, 입 니 다.헤헤,아직도 잘못 대답 한 것 이 아 닙 니까?우선 조급해 하지 말고 뒤의 문 제 를 보 세 요.
③:

#include <stdio.h>
int fun()
{
     static int count = 1;
     return ++count;
}

int main()
{
     int answer;
     answer = fun() - fun() * fun();
     printf( "%d
", answer);// ? return 0; }
이 문제 의 답 이 무엇 인지 생각해 보 세 요.일단 뒤에 있 는 거 보지 마 세 요.
정 답 은 ,헤헤,또 틀 리 는 거 아니 야?서 두 르 지 말고 뒤에 있 는 문 제 를 봐.
④:

#include <stdio.h>
int main()
{
	 int i = 1;
	 int ret = (++i) + (++i) + (++i);
	 printf("%d
", ret); printf("%d
", i); return 0; }
이것 이 마지막 문제 인 데,너 는 지금 몇 문 제 를 맞 혔 니?댓 글로 대답 해 보 세 요.헤헤
이 문제 의 답 은 입 니 다.
여러분 몇 문제 맞 혔 어 요?환영
 1.위 에 있 는 모든 문제 가 디자인 한 내용 을 본 격 적 으로 설명 합 니 다.
표현 식 의 값 을 구 하 는 순서 일 부 는 조작 문자 의 우선 순위 와 결합 성에 의 해 결정 된다.
마찬가지 로 일부 표현 식 의 조작 수 는 값 을 구 하 는 과정 에서 다른 유형 으로 전환 해 야 할 수도 있 습 니 다.
1.1 스텔스 형식 변환(정형 절단 및 향상)
암시 적 유형 전환,정형 향상,정형 절단 이란 무엇 입 니까?
C 의 정형 산술 연산 은 항상 으로 진행 된다.
이 정 도 를 얻 기 위해 서 표현 식 에 charshort 유형 이 있 으 면 사용 하기 전에 정형 으로 전환 해 야 합 니 다.이 과정 을 이 라 고 합 니 다.
.
비교적 큰 데이터 유형 이 작은 데이터 유형 에 저장 되 는 과정 을 이 라 고 한다.예 를 들 어 정형 a = 500 이다.그러나 a 는 그의 값 을 b 에 넣 었 다.b 는 a 를 완전히 저장 하지 못 하면 이 발생 한다.
.
이 전환 행 위 는 이 라 고 합 니 다.
1.1.1 제1 문제 설명

#include <stdio.h>
int main()
{
	char a = 3;
	char b = 127;
	char c = a + b;
	printf("   :%d",c);
	return 0;
}
우 리 는 컴퓨터 에서 모든 것 이 조작 되 는 패 치 라 는 것 을 알 고 있 습 니 다.그래서 여기 도 마찬가지 입 니 다.
그 중 양수 의 원 코드 는 반 코드 와 똑 같 습 니 다.
...음수 의 패 치 는 반 코드 에 1 을 더 하 는 것 이 고 반 코드 는 원 코드 입 니 다.기호 위 치 를 제외 한 모든 비트 가 위치 에 따라 반 대 됩 니 다.
a 는 1 개의 바이트 만 있 고 그의 패 치 는 00000011(2 진법)이다.
b.바이트 가 1 개 밖 에 없 는데 그의 패 치 는 01111111(바 이 너 리)입 니 다.
a.b 를 추가 하여 산술 작업 을 했 는데 4 개의 바이트 로 올 려 야 합 니 다.그리고 정형 향상 은 두 가지 방식 이 있 습 니 다.
  • 산술 향상:맨 앞 에 기호 비트 숫자 를 보충 하고 32 위
  • 까지
  • 논리 향상:무엇이든 0 만 보충 하고 32 위 까지 만 보충 합 니 다.
  • 대부분의 계산 기 는 을 진행 하 는데 여기 서 을 설명 한다.
    a 산술 향상 후 00000000000000000000000000000011b 산술 승급 후 00000000000000000000000001111111a+b 의 결 과 는---00000000000000000000000010000010c 에 저장 하면 c 는 1 바이트 밖 에 없 기 때문에 정형 절단 이 발생 하여 마지막 8 자리 만 액세스 합 니 다.10000010이때 c 액세스 하 는 것 은 패 치 이 고 c 는 기호 형 이 있 으 며 !! 이 며 인쇄 표시 시 제자리 에 있 는 원 코드 를 돌려 줍 니 다.이 패 치 에 대응 하 는 숫자 는 -126 입 니 다.
    다음은 문자 형식 의 대응 이해 도가 있 습 니 다.
    在这里插入图片描述
    그래서 기호 가 있 는 범 위 는[-128,127]입 니 다.
    부호 가 없 는 범 위 는[0,255]이다.
    동그라미 가 되 어 더 잘 이해 하고 기호 가 있 는 지 없 는 지 에 따라 찾 으 면 된다.
    在这里插入图片描述
    1.1.2 두 번 째 문제 설명
    
    #include <stdio.h>
    int main()
    {
    	char a = 0xb6;
    	short b = 0xb600;
    	int c = 0xb6000000;
    	if(a==0xb6)
    		printf("a");
    	if(b==0xb600)
    		printf("b");
    	if(c==0xb6000000)
    		printf("c");
    	return 0;
    }
    
    0xb 6 의 이 진 은 00000000000000000000000010110110 이다.
    a 에 저장 하면 절단 이 발생 하여 1011 0110 을 얻 을 수 있 습 니 다.
    0xb 600 의 이 진 은 00000000 00000000 10110110 00000000 이다.
    b 에 저장 하면 절단 이 발생 하여 10110110 00000000 을 얻 을 수 있 습 니 다.
    0xb6000000 10110110 00000000 00000000 00000000c 에 저장 하기 딱 좋아요.
    a.이때 저 장 된 것 은 패 치 입 니 다.a 는 0xb 6 와 비교 하여 연산 에 참 여 했 기 때문에 정형 으로 향상 되 었 습 니 다.11111111 11111111 11111111 10110110 ,
    정형 이 향 상 된 후의 숫자 는 0xb 6 의 2 진법 과 다 르 기 때문에 같 지 않다.
    b.이때 저 장 된 것 은 패 치 입 니 다.b 는 0xb 600 과 비교 하여 연산 에 참 여 했 기 때문에 정형 으로 향상 되 었 습 니 다.11111111 11111111 10110110 00000000정형 이 향 상 된 후의 숫자 는 0xb 600 의 2 진법 과 다 르 기 때문에 같 지 않다
    c.이때 저 장 된 것 은 10110110 00000000 00000000 00000000 입 니 다.주의 하 세 요~0xb6000000 이 정수 라 고 물 어 볼 수 있 습 니 다. !!!!! 은 문자 상수 가 기호 만 없 으 면 기본 int 유형 입 니 다.그래서 이때 0xb6000000 의 전체 수 치 는 int 를 초과 하면 이때 의 바 이 너 리 는 마이너스 의 보충 코드 라 고 생각 합 니 다.그래서 c 는 0xb6000000 과 같 습 니 다.
    1.1.3 세 번 째 문제 설명
    
    #include <stdio.h>
    int main()
    {
    	 char c = 1;
    	 printf("%u
    ", sizeof(c)); printf("%u
    ", sizeof(+c)); printf("%u
    ", sizeof(-c)); return 0; }
    sizeof 은 유형 속성의 값 을 측정 합 니 다.c 의 유형 은 char 으로 바이트 가 하나 밖 에 없 기 때문에 답 은 1 이다.+c,+ 은 단일 항목 연산 자 로 c 와 함께 정형 향상 이 발생 하여 int 가 되 었 기 때문에 4 개의 바이트 이 고 답 은 4 이다.-c,같은 이치 로 여전히 4 이다.
    1.2 산술 변환
    위 에서 말 했 듯 이 조작 수의 크기 가 int 보다 작 으 면 정형 향상 이 발생 하지만 모두 int 크기 와 같은 유형 이 산술 연산 에 참여 한다 면?여기 이 걸 릴 겁 니 다.
    산술 전환 이란 무엇 입 니까?예 를 들 어 다음 의 예:
    
    #include <stdio.h>
    int main()
    {
    	int a = -127;
    	unsigned int b =  129;
    	if(a > b)
    	{
    		printf("a   b");
    	}
    	return 0;
    }
    결 과 는 a b 으로 인쇄 됩 니 다.
    이것 이 바로 산술 전환 이기 때문에 같은 유형의 연산 을 만족 시 켜 야 합 니 다.unsigned int 는 int 보다 높 기 때문에 a 의 값 은 기본적으로 기호 가 없 으 며 a 는 b 보다 클 것 입 니 다.
    산술 승급 방향:
    在这里插入图片描述
    1.3 연산 자 속성
    복잡 한 표현 식 의 값 구 하 는 데 세 가지 영향 을 주 는 요소 가 있다.
    조작 부호 의 우선 순위 조작 부호 의 결합 성 은 값 을 구 하 는 순 서 를 제어 할 수 있 습 니까?
    1.3.1 우선 순 위 는 무엇 입 니까?
    바로 무엇 을 먼저 계산 할 것 인 가 를 결정 하 는 것 이다.예 를 들 어 d = a + b*c.* 의 우선 순위 가 + 보다 높 기 때문에 먼저 b*c 을 계산 한 다음 에 + 을 계산한다.
    1.3.2 결합 성 은 무엇 입 니까?
    바로 같은 우선 순위 로 어느 방향 으로 계산 할 지 결정 한다.예 를 들 어 d = a * b * c 은 연속 적 인 * 이기 때문에 우선 순 위 는 이미 쓸모 가 없 기 때문에 이때 가 바로 결합 성 이다.* 의 결합 성 은 왼쪽 에서 오른쪽으로 이다.즉,a*b 을 계산 한 다음 에 *c 을 계산 하 는 것 이다.
    1.3.3 구 치 순 서 는 무엇 입 니까?
    바로 어느 쪽.c 언어 만 계산 하 는 조작 부호 가 값 을 구 하 는 순 서 를 가 진 것 은 몇 개 밖 에 없다.예 를 들 어 ||, && , ! 이다.
    그럼 은 무슨 뜻 일 까요?
    예 를 들 어 a 는 0,b 는 2,c 는 3,d = a && b && c,d 의 값 은 마지막 에 0 이지 만 연산 할 때 a 만 도착 하면 끝 납 니 다.&& 은 가짜 에 부 딪 히 면 가짜 이 고 뒤의 진 위 는 이미 무관 하기 때 문 입 니 다.a 는 0 이 고 가짜 이기 때문에 뒤 에는 신경 쓰 지 않 아 도 됩 니 다.이것 이 바로 가치 순 서 를 구 하 는 것 입 니 다.
    다음은 값 을 구 하 는 순서 에 관 한 두 가지 연습 이 있다.
    
    #include <stdio.h>
    int main()
    {
        int i = 0,a=0,b=2,c =3,d=4;
        i = a++ && ++b && d++;
        printf("a = %d
    b = %d
    c = %d
    d = %d
    ", a, b, c, d); return 0; }
    답 은 1 2 3 4 입 니 다.이유:a 는 후 치+입 니 다.먼저 a=0 의 값 을 사용 합 니 다.처음부터 가짜 가 발생 했 고 그 후에 실행 하지 않 습 니 다.그러나 a 는 증가 하 였 습 니 다.후 치 는 이기 때 문 입 니 다.
    
    #include <stdio.h>
    int main()
    {
        int i = 0,a=0,b=2,c =3,d=4;
        i = ++a || ++b || d++;
        printf("a = %d
    b = %d
    c = %d
    d = %d
    ", a, b, c, d); return 0; }
    정 답:1 2 3 4,선행+,즉 먼저 추가,a 는 1 이 되 었 습 니 다.|| 이 진실 을 만 나 기만 하면 끝나 고 뒤의 진 위 를 상관 하지 않 기 때문에 a 만 변 했 습 니 다.
    여기에 연산 자 속성 표 가 있 습 니 다:
    在这里插入图片描述
    그 중에서 우선 순위 가 위 에서 아래로 점점 떨어진다.
    1.3.4 네 번 째 문제 설명
    
    #include <stdio.h>
    int main()
    {
    	 int c = 3;
    	 int ret = c + --c;
    	 printf("%d",ret);  
    	 return 0;
    }
    ret = c + --c 에 두 개의 조작 기호 가 있 는데 먼저 을 보고 -- 의 우선 순위 가 + 보다 높 아서 먼저 Cc 를 계산 하기 로 결 정 했 습 니 다.그런데 + 번 왼쪽 c 는 언제 준 비 했 습 니까?우 리 는 c 언어 가 컴 파일 언어 라 는 것 을 알 고 있 습 니 다.코드 를 다 쓴 후에 먼저 기계 언어 로 컴 파일 한 다음 에 실행 해 야 합 니 다.그러면 컴 파일 할 때+번 왼쪽 의 값 은 --c 전에 컴 파일 된 것 입 니까?아니면 --c 후에 컴 파일 된 것 입 니까?이것 은 확실 하지 않다.
  • vs 컴 파일 러 에서 답 은 4 입 니 다.그 는 --c 이후 c
  • 을 준 비 했 습 니 다.
  • gcc 컴 파일 러 에서 답 은 5 입 니 다.그 는 --c 전에 c
  • 을 준 비 했 습 니 다.
    그래서:이것 은 문제 코드 입 니 다.우 리 는 앞으로 이런 쓰레기 코드 를 쓰 지 마 세 요.
    1.3.5 다섯 번 째 문제 설명
    
    int main()
    {
    	 int i = 10;
    	 i = i-- - --i * ( i = -3 ) * i++ + ++i;
    	 printf("i = %d
    ", i); return 0; }
    이것 은 같은 이치 입 니 다.우선 순 위 를 알 지만 결합 성에 서 의 조작 수 는 언제 준비 되 어 있 는 지 확실 하지 않 습 니 다.서로 다른 컴 파일 러 에서 조작 한 결 과 를 보 세 요.
    在这里插入图片描述
    같은 쓰레기 코드 예요.
    1.3.6 여섯 번 째 문제 설명
    
    #include <stdio.h>
    int fun()
    {
         static int count = 1;
         return ++count;
    }
    
    int main()
    {
         int answer;
         answer = fun() - fun() * fun();
         printf( "%d
    ", answer);// ? return 0; }
    () 함수 호출 기호 우선 순위 가 가장 높 지만 여기 세 개가 있 는데 도대체 어느 것 을 먼저 호출 합 니까?이것 은 또 확실 하지 않다.
  • vs 컴 파일 러 는 왼쪽 에서 오른쪽으로 순서대로 호출 되 었 으 며 결 과 는-10.
  • 이다.
  • .그런데 다른 컴 파일 러 는 요?모두 gcc,codeblocks,Devc+를 시험 해 보 세 요.당신 은 완전히 다르다 는 것 을 알 게 될 것 입 니 다.
  • 1.3.7 제7 문제 설명
    그리고 이 문제 전에 블 로 거들 은 반드시 일부 대학 을 비판 해 야 한다.왜 일 까?학교 에서 ++ 기 호 를 가 르 칠 때 이런 유형 으로 시험 보 는 것 을 가장 좋아 하지 않 습 니까?여기 서 분명히 말씀 드 리 지만 이것 은 완전히 시간 을 낭비 하 는 것 입 니 다!!이런 코드 는 전혀 의미 가 없 으 니까!!!
    
    #include <stdio.h>
    int main()
    {
    	 int i = 1;
    	 int ret = (++i) + (++i) + (++i);
    	 printf("%d
    ", ret); printf("%d
    ", i); return 0; }
    우선 () 괄호 의 우선 순위 가 가장 높 지만 세 개가 있 는데 도대체 어느 것 을 먼저 계산 합 니까?
    그 다음으로 i 의 변화 가 다른 것 에 영향 을 주지 않 을 까?여기 도 확실 하지 않 습 니 다.네 번 째 문제 에서 우리 가 말 한 그 번역 전 c 이 언제 준 비 했 는 지 와 같 습 니 다.확실 하지 않 습 니 다.!!!
    vs 컴 파일 러 의 값 은 12,4gcc 컴 파일 러 의 값 은 104 입 니 다.
    서로 다른 컴 파일 러 의 서로 다른 값,결과 가 다 릅 니 다.이런 코드 는 코드 라 고 부 르 지 않 습 니 다.!!!
    그래서 나중에 이런 문 제 를 보고 바로 뛰 어 넘 는 것 은 의미 가 없다.
    결론:정형 향상 과 절단 이 무엇 인지 알 게 되 었 습 니 다.산술 전환 이 무엇 인지 알 게 되 었 습 니 다.어떤 조작 자의 속성 을 알 게 되 었 습 니 다.앞으로 이런 유사 한 쓰레기 코드 를 쓸 수 없습니다.
    이상 은 프로그래머 가 C 언어 중의 이 작은 세부 사항 에 대한 상세 한 내용 을 모 르 고 C 언어 에 관 한 작은 세부 사항 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기