ホームページ  >  記事  >  バックエンド開発  >  C 言語プログラミングでよくある間違いのコレクション

C 言語プログラミングでよくある間違いのコレクション

黄舟
黄舟オリジナル
2016-12-16 09:38:321448ブラウズ

C言語でよくあるエラー(再掲)
C言語の最大の特徴は、強力な機能、簡単で柔軟な使用法です。 C でコンパイルされたプログラムは、他の高級言語ほど構文チェックが厳密ではないため、プログラマにとっては「柔軟性の余地」が残されていますが、この柔軟性は、特に C 言語を学習する初心者にとっては多くの不便をもたらします。どこで間違えたのかさえわからないような間違いを犯します。間違ったプログラムを見ても修正方法がわかりません。 C の学習を通じて、C プログラミングでよくある間違いをいくつか蓄積したので、参考のために書きました。
1. 識別子を記述する場合、大文字と小文字の区別は無視されます。
main()
{
int a=5;
PRintf("%d",A);
}
コンパイラは、a と A を 2 つの異なる変数名と見なし、エラー メッセージを表示します。 C では、大文字と小文字を 2 つの異なる文字と見なします。慣例により、読みやすくするために、記号定数名は大文字で書かれ、変数名は小文字で書かれます。
2. 変数の型を無視して不正な操作を実行する。
main()
{
float a,b;
printf("%d",a%b);
}
% は、a/b の整数余りを取得する剰余演算です。整数変数 a と b は剰余演算を実行できますが、実数変数は「剰余」演算を実行できません。
3. 文字定数と文字列定数を混同します。
char c;
c="a";
ここでは、文字定数と文字列定数が混同されています。文字定数は、一対の単一引用符で囲まれた単一の文字であり、文字列定数は、一対の二重引用符で囲まれた文字です。 C では、"" を文字列の終了マークとして使用することが規定されています。これはシステムによって自動的に追加されるため、文字列 "a" には実際には 'a' と '' の 2 つの文字が含まれており、これを文字変数に割り当てることはできません。の仕事。
4. 「=」と「==」の違いは無視してください。
多くの高級言語では、「=」記号が関係演算子「等しい」として使用されます。たとえば、BASIC プログラムでは
if (a=3) then...
と書くことができますが、C 言語では、「=」は代入演算子、「==」は関係演算子です。例:
if (a==3) a=b;
前者は a が 3 に等しいかどうかを比較することを意味し、後者は a と 3 が等しい場合に値 b を a に代入することを意味します。初心者は習慣のためにこのような間違いを犯してしまうことがよくあります。
5. セミコロンを追加するのを忘れました。
セミコロンは C ステートメントの必須部分であり、ステートメントの最後にはセミコロンが必要です。
a=1
b=2
コンパイル時に、コンパイラーは「a=1」の後にセミコロンを見つけられないため、次の行「b=2」を前のステートメント行の一部として扱います。構文エラー。エラーを修正するとき、エラーが指摘された行にエラーが見つからなかった場合でも、前の行にセミコロンが抜けていないか確認する必要があることがあります。
{ z=x+y;
t=z/100;
printf("%f",t);
}
複合ステートメントの場合、最後のステートメントの最後のセミコロンは無視できません (これは PASCAL とは異なります)。 。
6. さらにセミコロンを追加します。
次のような複合ステートメントの場合:
{ z=x+y;
t=z/100;
printf("%f",t);
};
中括弧の後にセミコロンがあってはなりません。複合ステートメント、そうでない場合は余分になります。
別の例:
if (a%3==0);
I++;
これは、a を 3 で割る場合、1 を加算します。ただし、if (a%3==0) の後に余分なセミコロンがあるため、if ステートメントはここで終了し、プログラムは a を 3 で割るかどうかに関係なく、自動的に 1 ずつ増加します。
別の例:
for (I=0;I
本来の目的は、5 つの数値を順番に入力し、各数値が入力された後に出力することです。 for()の後にセミコロンが追加されるため、ループ本体は空文となります。このとき入出力できる数値は1つだけです。
7. 変数を入力するときにアドレス演算子「&」を追加するのを忘れました。
int a,b;
scanf("%d%d",a,b);
これは違法です。 Scanf 関数の機能は、メモリ内の a と b のアドレスに従って a と b の値を保存することです。 「&a」はメモリ内の a のアドレスを指します。
8. データの入力方法が要件を満たしていません。 ①scanf("%d%d",&a,&b);
データを入力する場合、2つのデータの間の区切り文字としてカンマを使用することはできません。例えば、次の入力は不正です:
3, 4
データを入力する場合、2つのデータの間に。 data 1つ以上のスペースで区切って、EnterキーまたはTabキーを使用することもできます。
②scanf("%d,%d",&a,&b);
C では、「書式制御」文字列に書式記述以外の文字がある場合、データ文字を入力するときにこれらの文字と同じ文字を入力する必要があると規定しています。 。次の入力は正当です:
3, 4
現時点では、カンマの代わりにスペースや他の文字を使用するのは正しくありません。
3 4 3:4
別の例:
scanf("a=%d,b=%d",&a,&b);
入力は次の形式である必要があります:
a=3,b=4
9 . 文字を入力してください 形式が要件と一致しません。
「%c」形式で文字を入力する場合、「スペース文字」と「エスケープ文字」の両方が有効な文字として入力されます。
scanf("%c%c%c",&c1,&c2,&c3);
a b c を入力した場合
文字「a」は c1 に送信され、文字「 」は c2 に送信され、文字「b」は%c は 1 文字だけを読み取る必要があり、2 文字間の間隔としてスペースを使用する必要がないため、c3 に送信されます。
10. 入力および出力のデータ型が、使用されている形式指定子と一致しません。
たとえば、aは整数型として定義され、bは実数型として定義されています
a=3;b=4.5;
printf("%f%d ",a,b);
コンパイル中にエラー メッセージは表示されませんが、実行結果は本来の意図と一致しません。この種のエラーには特別な注意が必要です。
11. データを入力するときは、精度を指定するようにしてください。
scanf("%7.2f",&a);
これは不正であり、データ入力時に精度を指定できません。
12. switch ステートメントに Break ステートメントがありません。
例: テストスコアレベルに基づいてパーセンテージセグメントを出力します。
switch(成績)
{ case 'A':printf("85~100 ");
case 'B':printf("70~84 ");
case 'C':printf("60~69 ") ;
case 'D':printf("default:printf("error ");
break ステートメントが省略されているため、case はラベルとしてのみ機能し、判断としては機能しません。したがって、グレード値が A の場合、printf 関数は最初のステートメントを実行した後、2 番目、3 番目、4 番目、および 5 番目の printf 関数ステートメントを実行します。正しい書き方は、各分岐の後に「break;」を追加することです。例:
case 'A':printf("85~100 ");break;
13. while ステートメントと do-while ステートメントの詳細の違いは無視します。
(1)main()
{int a=0,I;

scanf("%d",&I);
while(I
printf("%d",a);
}
(2)main()
{int a=0,I;
scanf("%d",&I);
do
while(I<=10);
printf("%d",a);
入力 I の値が 10 以下の場合、2 つの結果は同じであることがわかります。 I>10 の場合、結果は異なります。 while ループは最初に決定されてから実行されますが、do-while ループは最初に実行されてから決定されるためです。 10 より大きい数値の場合、while ループはループ本体を 1 回実行しませんが、do-while ステートメントはループ本体を 1 回実行します。
14. 配列を定義する際の変数の誤用。
int n;
scanf("%d",&n);
int a[n];
角括弧で囲まれた配列名は定数式であり、定数とシンボリック定数を含めることができます。つまり、C では配列のサイズを動的に定義することはできません。
15. 配列を定義する際、定義した「要素数」を使用できる添字の最大値と間違えます。
main()
{static int a[10]=;
printf("%d",a[10]);
}
C 言語では次のように規定されています: 定義するときは a[10] を使用し、a 配列が 10 であることを示します要素。添え字の値は 0 から始まるため、配列要素 a[10] は存在しません。
16. 配列を初期化するとき、静的ストレージは使用されません。
int a[3]=;
このように配列を初期化するのは間違っています。 C 言語では、静的ストレージ (static) 配列と外部ストレージ (exterm) 配列のみを初期化できると規定されています。
static int a[3]=;
17 に変更する必要があります。アドレス演算子 & を追加すべきではない場所にアドレス演算子 & が追加されます。
scanf("%s",&str);
C 言語のコンパイル システムは、配列名を次のように処理します。配列名は配列の開始アドレスを表し、scanf 関数の入力項目は文字配列名であり、アドレス記号&を追加する必要はありません。
scanf("%s",str);
18. 関数内の仮パラメータとローカル変数の両方が定義されているように変更する必要があります。
int max(x,y)
int x,y,z;

仮パラメータは関数本体の外側で定義する必要がありますが、ローカル変数は関数本体の内側で定義する必要があります。これを次のように変更する必要があります:
int max(x,y)
int x,y;
{int z;
z=x>y?x:y;
return(z);
}

上記はC 言語でプログラミングする簡単な方法 間違い集の内容、その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。