프로그래머 들 은 C 언어의 이런 세부 사항 을 모른다.
컴 퓨 팅 디 테 일
①:
#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 의 정형 산술 연산 은 항상
으로 진행 된다.이 정 도 를 얻 기 위해 서 표현 식 에
char
과 short
유형 이 있 으 면 사용 하기 전에 정형 으로 전환 해 야 합 니 다.이 과정 을
이 라 고 합 니 다..
비교적 큰 데이터 유형 이 작은 데이터 유형 에 저장 되 는 과정 을
이 라 고 한다.예 를 들 어 정형 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 개의 바이트 로 올 려 야 합 니 다.그리고 정형 향상 은 두 가지 방식 이 있 습 니 다.
을 진행 하 는데 여기 서
을 설명 한다.a 산술 향상 후
00000000000000000000000000000011
b 산술 승급 후 00000000000000000000000001111111
a+b 의 결 과 는---00000000000000000000000010000010
c 에 저장 하면 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 00000000
c 에 저장 하기 딱 좋아요.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
후에 컴 파일 된 것 입 니까?이것 은 확실 하지 않다.--c
이후 c --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;
}
()
함수 호출 기호 우선 순위 가 가장 높 지만 여기 세 개가 있 는데 도대체 어느 것 을 먼저 호출 합 니까?이것 은 또 확실 하지 않다.그리고 이 문제 전에 블 로 거들 은 반드시 일부 대학 을 비판 해 야 한다.왜 일 까?학교 에서
++
기 호 를 가 르 칠 때 이런 유형 으로 시험 보 는 것 을 가장 좋아 하지 않 습 니까?여기 서 분명히 말씀 드 리 지만 이것 은 완전히 시간 을 낭비 하 는 것 입 니 다!!이런 코드 는 전혀 의미 가 없 으 니까!!!
#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 언어 에 관 한 작은 세부 사항 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 구현 천둥 제거 게임 상세 정보먼저 작은 메뉴를 표시하고 게임을 할지 여부를 선택하십시오.사용자가 종료를 선택하면 프로그램 실행이 끝나고, 사용자가 게임을 선택하면 지뢰 제거 위치 좌표를 입력하라는 메시지가 표시됩니다.사용자가 입력한 좌표가 바둑...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.