C++間違いやすい問題
1632 ワード
次の関数の正しい数は0です.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
三つは全部間違っている.
分析:
第1の問題:一般的にcharタイプ範囲は-128~127であり、unsigned charタイプ範囲は0~255であるため、iの取値範囲は0~255である.
MAX_CHARの値範囲が255以上の場合、i++を実行すると、iは256以上の数字を表すことができず、無線サイクルに陥る.
2つ目の質問:
ポイントは関数のpのアイデンティティで、彼はポインタなのか、配列名なのか.
ポインタpであれば、pは文字列定数を格納するアドレスを指し、pを返すと文字列定数アドレス値を返し、呼び出し関数が終了しても文字列定数は消えない(定数).したがって、定数を返すアドレスはエラーしない.
配列pであれば、関数は文字列定数の文字を1つずつp配列にコピーし、pを返すと配列pを返すが、呼び出し関数が終了するとpは破棄され、中の要素は存在しない.
例ではpは配列名なのでエラーが発生し,pが指すアドレスはランダム値である.
char p[]=「hello」;char*p="hello";それでいいです.
3つ目の質問:
ポイントはstr++です.この実際の文はstr=str+1です.strは配列名であり,配列名は定数であるため定数に値を割り当てることはできない.(str+1は実行できるがstr=.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void
test1()
{
unsigned
char
array[MAX_CHAR+1],i;
for
(i=0;i<=MAX_CHAR;i++){
array[i]=i;
}
}
char
*test2()
{
char
p[] =
"hello world"
;
return
p;
}
char
*p =test2();
void
test3(){
char
str[10];
str++;
*str=
'0'
;
}
三つは全部間違っている.
分析:
第1の問題:一般的にcharタイプ範囲は-128~127であり、unsigned charタイプ範囲は0~255であるため、iの取値範囲は0~255である.
MAX_CHARの値範囲が255以上の場合、i++を実行すると、iは256以上の数字を表すことができず、無線サイクルに陥る.
2つ目の質問:
ポイントは関数のpのアイデンティティで、彼はポインタなのか、配列名なのか.
ポインタpであれば、pは文字列定数を格納するアドレスを指し、pを返すと文字列定数アドレス値を返し、呼び出し関数が終了しても文字列定数は消えない(定数).したがって、定数を返すアドレスはエラーしない.
配列pであれば、関数は文字列定数の文字を1つずつp配列にコピーし、pを返すと配列pを返すが、呼び出し関数が終了するとpは破棄され、中の要素は存在しない.
例ではpは配列名なのでエラーが発生し,pが指すアドレスはランダム値である.
char p[]=「hello」;char*p="hello";それでいいです.
3つ目の質問:
ポイントはstr++です.この実際の文はstr=str+1です.strは配列名であり,配列名は定数であるため定数に値を割り当てることはできない.(str+1は実行できるがstr=.)