C言語復習一----キーワード

2959 ワード

1.定義、宣言

定義とは、コンパイラがメモリを割り当て、名前を付けるオブジェクトを作成することです.
この名前は私たちのいわゆる変数名やオブジェクト名です.
1つの変数またはオブジェクトは、一定の領域(関数内、グローバル)で1回しか定義できません.複数回、コンパイラは定義を繰り返すよう求めます.
宣言には2つの意味があります.
まず、この名前はメモリに一致しています.次のコード用の変数やオブジェクトは別の場所で定義されています.
第二に、この名前はすでに予約されており、他の場所では変数名やオブジェクト名として使用できないことをコンパイラに伝えることです.

A)int i;
B)extern int i;
Aは定義Bは宣言
違いは、オブジェクトに割り当てられたメモリを作成し、割り当てられていないメモリを宣言することです.

2.最も速いキーワードregister


要求コンパイラはできるだけCPUの内部のレジスタに変数を存在させる.register修飾の制限、register変数はcpuレジスタに受け入れられるタイプでなければならない.
register変数は単一の値でなければならず、その長さは整数の長さ以下であるべきである.
またregister変数はメモリに存在しない可能性があるため、アドレス演算子「&」は使用できません.

3.static


最初の役割は変数を修飾し、変数はローカル変数とグローバル変数に分けられますが、メモリの静的領域があります。

静的グローバル変数、役割ドメインは定義されたファイル(定義の開始からファイルの終了まで)に限られ、他のファイルはextern宣言を使用しても使用できません.
静的局所変数は、関数体で定義すると、この関数でしか使用できません.同じファイルの他の関数では使用できません.
staticで修飾された変数はメモリの静的領域にあるため,この関数が終了してもこの静的変数は解放されず,関数は次回使用時にこの値を用いることができる.
メモリの静的領域?
#include <stdio.h>
#include <stdlib.h>
static int i = 0;
void fun1()
{
static int j = 0;
j++;
printf("j = %d
",j); } void fun2() { i++; printf(" i = %d
",i); } int main() { int k; for( k = 0 ; k < 10 ; k++) { fun1(); fun2(); } //printf("%d\t%d
",i,j); return 0; }

iとjの結果はいずれも10である
過去にstatic i=10 j=1を削除した場合.
2番目の役割修飾関数が関数を静的関数にするのは格納方式ではなく,関数に対する役割ドメインが本ファイル(内部関数)に限られることを指す.
利点:異なる人が作成した異なる関数は、自分が定義した関数が他のファイルの韓国式と同名であるかどうかを心配する必要はありません.

4.基本データ型---short、int、long、char、float、double


6つのキーワードは、6の基本データ型定義変数を表し、初期化を忘れないでください.変数を定義するときにコンパイラがこのメモリを空にしたとは限りません.彼の値は無効なデータの異なるタイプ間の演算である可能性があり、一般的には低精度データから高精度データへの拡張である.

5、sizeofは関数ではなくキーワード


sizeof(int)*pはどういう意味ですか.結果は4です.
sizeof(char)*p結果は1
sizeof(char*)p結果は4
(int)*pとは、強制変換*pが指す変数をintとする

6.singed unsigned

32ビットsinged int範囲-231-2 31-1
32ビットのunsinged int範囲0-2 32-1
コンパイラのデフォルトはsingedです
タイトル
int main()
{
char a[1000];
int i ;
for ( i=0; i<1000; i++ )
{
a[i] = -1 -i;
}
printf("%d",strlen(a) );
return 0;
}
結果は255でした
負数符号化のルールによれば、−1の符号化は0 xff、−2の符号化は0 xfe…iの値が127の場合、a[127]の値は−128であり、−128はcharタイプデータが表す最小の負数であることが分かる.iが増加し続けると、a[128]の値は-129にならないに違いない.このときオーバーフローが発生し、-129は9ビットで格納され、charタイプデータは8ビットしかないため、最上位は破棄される.残りの8ビットは、元の9ビットの符号化の低い8ビットの値、すなわち0 x 7 fである.iが255に増加し続けると、−256の符号化の下位8ビットは0である.そしてiが256に増加すると、-257の補符号の低8ビットはすべて1であり、すなわち低8ビットの補符号は0 xffであり、このようにしてまた新しいサイクルが始まる......上記の分析によれば、a[0]からa[254]までの値は0ではなく、a[255]の値は0である.strlen関数は文字列の長さを計算し、文字列の最後の'0'は含まれません.文字列が終わるかどうかを判断するフラグは、「0」に遭遇するかどうかを見ることです.'0'に遭遇した場合は、この文字列は終了します.
問題;1)、上記の説明によると、-0と+0はメモリにどのように格納されますか?
2) ,int i = -20;
unsigned j = 10;
i+jの値はいくらですか?どうして?
3)、次のコードに何か問題がありますか?
unsigned i ;
for (i=9;i>=0;i--)
{
printf("%u",i);
}
デッドサイクル