프로 그래 밍 기본 개념 (면접 보전 독서 노트 1)
23888 단어 독서 노트
1:i++;
What will be the output of the following C code ?
#include
<
stdio.h
>
int
main() {
int
b
=
3
;
int
arr[]
=
{
6
,
7
,
8
,
9
,
10
};
int
*
ptr
=
arr;
*
(ptr
++
)
+=
123
;
printf(
"
%d, %d
"
,
*
ptr,
*
(
++
ptr));
}
2: 프로 그래 밍 스타일
We have two pieces of code, which one do you prefer, and tell why ?
if
(
'
A
'
==
a) {
a
++
;
}
B
if
(a
==
'
A
'
) {
a
++
;
}
Answer:
인터넷 상의 토론 과 논쟁 이 꽤 많다.
/ * 수정 중 C 언어 는 함수 매개 변수 스 택 순서 에 대해 규정 하지 않 았 고 구체 적 으로 컴 파일 환경 과 관련 이 있 습 니 다.
또한 스 택 순서 와 구 치 순서 사이 에는 필연 적 인 관계 가 없다.(보류)
논란 이 있 습 니 다. 여 기 는 사용 을 피 하 는 것 을 권장 합 니 다. (매개 변수 목록 에서 i + 와 같은 문 구 를 사용 하지 마 세 요. 한 마디 로 좋 은 습관 은 아 닙 니 다.) * /
1: C 에서 printf 가 파 라 메 터 를 계산 할 때 오른쪽 에서 왼쪽으로 스 택 을 눌 렀 기 때문에 8 입 니 다.
관련 지식 포인트: (a) 부작용 과 시퀀스 점 (b) 스 택 순서 와 값 순서
3: 형식 변환:
3.1
다음 프로그램의 출력 결 과 는 얼마 입 니까?
#include
<
iostream
>
using
namespace
std;
int
main() {
unsigned
char
a
=
0xA5
;
unsigned
char
b
=
~
a
>>
4
;
printf(
"
%d
"
, b);
return
0
;
}
Answer:
2: A 가 좋 습 니 다. 첫 번 째 쓰기 때문에 '=' 을 '=' 으로 잘못 썼 습 니 다. 상수 에 값 을 부여 하 는 것 을 허락 하지 않 기 때문에 컴 파일 러 가 잘못 보고 할 수 있 습 니 다.
3.2
다음 프로그램의 출력 결 과 는 얼마 입 니까?
#include
<
iostream
>
using
namespace
std;
int
main() {
float
a
=
1.0f
;
cout
<<
(
int
)a
<<
endl;
//
a
cout
<<
&
a
<<
endl;
//
a
cout
<<
(
int
&
)a
<<
endl;
//
a , 。
cout
<<
boolalpha
<<
( (
int
)a
==
(
int
&
)a )
<<
endl;
// ?
float
b
=
0.0f
;
cout
<<
(
int
)b
<<
endl;
cout
<<
&
b
<<
endl;
cout
<<
(
int
&
)b
<<
endl;
cout
<<
boolalpha
<<
( (
int
)b
==
(
int
&
)b )
<<
endl;
// ?
return
0
;
}
Answer:
3.1:245
(1) unsigned char b = ~a >> 4;계산 할 때 컴 파일 러 는 먼저 a 와 4 의 값 을 int (즉 정수 향상) 로 바 꾼 후에 계산 하고 결 과 를 계산한다.
나 온 후에 결 과 를 unsigned char 할당 b 로 변환 합 니 다.
(2) >> 우선 순위 가 ~ 보다 높 습 니 다.
3.3
다음 프로그램의 출력 결 과 는 얼마 입 니까?
#include
<
stdio.h
>
int
main() {
unsigned
int
a
=
0xfffffff7
;
unsigned
char
i
=
(unsigned
char
)a;
char
*
b
=
(
char
*
)
&
a;
printf(
"
%08x, %08x
"
, i,
*
b);
}
Answer:
3.2:false true
/*
(int&)a, , a , 。
(int)a ,a int
float ,
754 :
( ),
1.0f
0011 1111 1000 0000 0000 0000 0000 0000
0x3f800000,
int float 1.0f , false。
0 , true。
*/
4: 비 또는 문제
4.1 하나의 표현 식 으로 하나의 수 x 가 2 ^ N (2, 4, 8, 16..) 인지 판단 하고 순환 문 구 를 사용 할 수 없습니다.
Answer
3.3:000000f7, fffffff7
unsigned int 변수 가 unsigned char 에 할당 되 었 을 때 바이트 절단 이 발생 합 니 다 (3 비트 와 3 비트 이상 의 버 림, 낮은 두 자리 남기 기).
4.2 다음 프로그램의 결 과 는 얼마 입 니까?
#include
<
iostream
>
using
namespace
std;
int
main() {
int
count
=
0
;
int
m
=
9999
;
while
(m) {
count
++
;
m
=
m
&
(m
-
1
);
}
cout
<<
count
<<
endl;
}
Answer: 4.1
!x&(x-1)
5: a, b 교환
There are two int variables:a and b, don't use "if", "? :", "switch" or other judgement statements, find out
the biggest one of the two numbers.
Answer:4.2:
8
m 의 이 진 은 1 에 나타 난 개 수 를 나타 낸다. 즉, count 의 값 으로 m & (m - 1) 연산 을 할 때마다 맨 오른쪽 에 있 는 1 을 제거 하 는 것 이다.
6: C 와 C + + 의 관계
Answer 5:
(1)int max = (a + b + abs(a - b)) / 2;
(2)
#include
<
cstdio
>
using
namespace
std;
int
main () {
int
a, b;
while
(scanf(
"
%d %d
"
,
&
a,
&
b)
==
2
) {
int
c
=
a
-
b;
char
*
str[
2
]
=
{
"
a
"
,
"
b
"
};
c
=
unsigned(c)
>>
(
sizeof
(
int
)
*
8
-
1
);
/*
,
int c 【-2^31, 2^31 - 1】
if (c < 0) {
unsigned(c) c + 2^32;
} else {
unsigned(c) c ;
}
unsigned 32 , c 31 , 0, 1
if (a >= b) {
then c >= 0
unsigned(c) = c; 【0,2^31 - 1】 0
} else {
then c < 0
c 【-2^31, 0)
unsigned(c) = c + 2^32 >= 2^31 , 1
}
*/
printf(
"
%s
"
, str[c]);
}
return
0
;
}
6.1: C + + 프로그램 에서 C 컴 파 일 러 에 의 해 컴 파 일 된 함 수 를 호출 합 니 다. 왜 extern "C" 를 추가 합 니까?
6.2: 헤더 파일 의 ifndef / define / endif 는 무엇 에 사용 합 니까?
Answer:
6.1
C + + 는 리 셋 함 수 를 지원 합 니 다. C 언어 는 리 셋 함 수 를 지원 하지 않 습 니 다.함수 가 C + + 로 컴 파일 된 후 라 이브 러 리 함수 의 이름과 C 언어의 차이 가 있 습 니 다.
예: 만약 함수 원형 이 void foo (int x, int y) 라면. C 컴 파일 후 라 이브 러 리 의 이름 은 입 니 다.foo,
C + + 컴 파 일 러 는foo_int_int 같은 이름...
6.2: 이 헤더 파일 이 중복 참조 되 는 것 을 방지 합 니 다.
오리지널 글 은 전재 할 때 다음 과 같이 명시 해 주 십시오. { 잊어버리다 }
본문 주소: http://www.cnblogs.com/slave_wc