C ++いくつかの一般的なインタビューの質問---継続的な更新

1.変数の宣言と定義の違いは何ですか

変数の定義は変数のアドレスとストレージスペースを割り当て、変数の宣言はアドレスを割り当てません。変数は複数の場所で宣言できますが、1つの場所でのみ定義されます。同時に、extern変更変数の宣言を追加して、この変数がファイルの外部またはファイルの後ろの部分で定義されることを示します。
説明-多くの場合、変数はメモリスペースを割り当てないと宣言され、外部変数などの特別に使用されるまで初期化されません。

int main()
{
extern int A;
//这是个声明而不是定义,声明A是一个已经定义了的外部变量
//注意:声明外部变量时可以把变量类型去掉如:extern A;
dosth(); //执行函数
}
int A; //是定义,定义了A为整型的外部变量

2.#ifdef、#else、#endif、ifndefの役割を簡単に説明します

プログラムでは、#ifdefと#endifを使用して、特定のモジュールのコードを特別に定義し、この機能を特定のユーザーに提供できます。ユーザーは、不要なときにそれらをブロックできます。

#ifdef MATH
#include "math.c"
#endif

同時に、ウィンドウの下でハードウェアのコンパイルを処理する場合、この種のコンパイルを使用してハードウェアをバイパスし、直接コンパイルして期待される結果を得ることができます。
注– ifステートメントは条件付きコンパイルコマンドなしで直接使用して要件を満たすことができますが、ターゲットプログラムが長く、実行時間が長くなります。条件付きコンパイルを実行すると、コンパイルされたステートメントを減らすことができるため、ターゲットプログラムの長さと実行時間が短縮されます。 。

3. int、bool、float、pointer変数および「ゼロ値」を比較するためのifステートメントを記述します

//int与零值比较
if ( n == 0 )
if ( n != 0 )
//bool与零值比较
if (flag) // 表示flag为真
if (!flag) // 表示flag为假
//float与零值比较
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON) //其中EPSINON是允许的误差(即精度)。
//指针变量与零值比较
if (p == NULL)
if (p != NULL)

4.構造を直接割り当てることはできますか?

宣言時に直接初期化でき、同じ構造の異なるオブジェクトを直接割り当てることもできますが、構造にポインタ「メンバー」が含まれている場合は注意してください。
注–同じメモリへのポインタが複数ある場合、ポインタによってこのメモリを解放すると、他のポインタの不正な操作が発生する可能性があります。したがって、解放する前に、他のポインタがこのメモリ空間を使用しないことを確認する必要があります

5.sizeofとstrlenの違い

sizeofは演算子、strlenはライブラリ関数
sizeofのパラメータあり、データ型または変数にすることができます。また、strlenは「\ 0」で終わる文字列のみをパラメータとして使用できます。
コンパイラはコンパイル時にsizeofの結果を計算しますが、strlen関数は実行時に計算する必要があり、sizeofによって計算されるデータタイプはメモリのサイズを占有します。また、strlen
は、sizeofのパラメーターが縮退しないため、文字列の実際の長さを計算し、strlenに渡されるとポインターに縮退します。

6.c言語のキーワードstaticとC ++のキーワードstaticの違いは何ですか

cでは、staticキーワードを使用して、ローカル静的変数と外部静的変数および関数を変更します。C ++の上記の関数に加えて、クラスメンバーの変数と関数を定義するためにも使用されます。つまり、静的メンバーと静的メンバー関数です。
注意-静的メモリとプログラミングのグローバル特性により、異なる時間に呼び出される関数が情報を通信および転送できるようになり、C ++静的メンバーは複数のオブジェクトインスタンス間で実行できます。コミュニケーション

7.c言語のMallocとC ++の新しい削除の違い

newとdeleteは演算子であり、オーバーロードできます
。MallocはC ++でのみ使用できます。Free上書き可能な関数です。CとC ++はどちらも
newを使用してオブジェクトのコンストラクターを呼び出すことができます。対応するdeleteはデストラクタを呼び出します。
mallocはメモリを割り当てるだけで、freeはメモリを再利用するだけで、構築およびデストラクタ機能は実行しません。
特定のデータタイプのリターンポインタを新規および削除します。mallocおよびfreeはvoidポインタを返します。
–mallocによって適用されるメモリスペースはfreeで解放する必要があります。 newによって適用されたメモリスペースは、混合ではなく削除で解放する必要があります

8.「標準」マクロMINを記述します

# d e f i n e m i n ( a , b ) ( ( a ) < = ( b ) ? ( a ) : ( b ) )

9. ++ iとi ++の違い

++ iは1をインクリメントしてから、
i ++を返します。最初に1を返し、次に1をインクリメントします。

10.揮発性物質の役割は何ですか

ステータスレジスタなどの並列デバイスハードウェアレジスタ。
割り込みサービスサブルーチンによってアクセスされる非自動変数
。複数のスレッド間で複数のタスクによって共有される変数。
注– volatileは組み込みアプリケーションでより多く使用されますが、PC側にはより多くのソフトウェアがあります。スレッドでは、揮発性の変更された重要な変数も非常に実用的です

11.パラメータをconstとvolatileの両方にすることはできますか

答えは「はい」です。constとvolatileを使用して変数を同時に変更するということは、変数がプログラム内で読み取り専用であり、変更できないことを意味します。外部の変更でのみ変更でき、コンパイラーはこの変数を最適化しません。この変数を使用するたびに、レジスタに移動してバックアップを読み取るのではなく、メモリに移動してこの変数の値を読み取る必要があります。
注–ここでconstの意味に注意する必要があります。constは、プログラム内のコードが特定の変数を変更することを許可しません。コンパイル時に役割を果たします。実際には、メモリの特定のセクションの読み取りと書き込みを禁止しません。

12. aと&aの違いは何ですか?

&aは、変数aのアドレスが
場所によって意味が異なる場合を意味します。
宣言ステートメントでは、aの前にオペランドがなく、aがポインターである場合、aは変数であり、int aは
他のステートメントにあることを示すだけです。aは、b = * aなど、ポインタaが指すアドレスに格納されているデータを表します。

13.cを使用してエンドレスループプログラムをコンパイルします

while(1)
{ }

注–多くの方法で同じ機能を実現できますが、特に読み取りおよび組み込みソフトウェアの場合、方法が異なれば時間とスペースの占有率も異なり、プロセッサ速度が比較的遅く、ストレージスペースが小さいため、さまざまな時間とスペースの利点を選択してくださいメソッドの最初の考慮事項。

14.グローバル変数とローカル変数の違いは何ですか?それはどのように達成されますか?オペレーティングシステムとコンパイラはどのように認識しますか?

すべての変数は、プログラム全体からアクセスできる変数です。誰でもアクセスできます。プログラム全体の存続期間は、実行から終了までです。プログラムの終了時に占有されていたメモリが解放されます。
ローカル変数はモジュール(サブルーチン、関数)に存在し、モジュールのみが配置されます。アクセス可能、他のモジュールに直接アクセスできません。モジュールが呼び出されると、ローカル変数が消え、占有メモリが解放されます。
オペレーティングシステムとコンパイラがメモリ割り当ての場所を認識している場合があります。グローバル変数は、グローバルデータセグメントとプログラムに割り当てられます。実行時に記録され、ローカル変数がスタックに割り当てられます。

15.CおよびC ++プログラムのコンパイルのメモリ割り当てについて簡単に説明します

静的ストレージ領域からの割り当て-メモリはプログラムのコンパイル時に割り当てられ、このメモリはプログラムの実行期間全体にわたって存在します。余波を一掃するシステムがあるので、速くて間違いを犯しにくいです。たとえば、グローバル変数、静的変数、定数文字列など
がスタックに割り当てられます。関数が実行されると、関数内のローカル変数のストレージユニットがスタックに作成され、これらのストレージユニットは関数の実行時に自動的に解放されます。
ヒープへの割り当て-動的メモリ割り当て。プログラムの実行中に、mallocまたはnewを使用して任意のサイズのメモリを適用します。プログラマは、メモリを解放するためにfreeとdeleteをいつ使用するかについて責任を負います。動的メモリの寿命はプログラマーによって決定されます。ヒープにスペースが割り当てられている場合は、それを再利用する責任があります。そうしないと、実行中のプログラムでメモリリークが発生します。さまざまなサイズのヒープスペースを頻繁に割り当てて解放すると、ヒープフラグメントが生成されます。

おすすめ

転載: blog.51cto.com/13475106/2586629