C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

CとC++での未定義、未指定、および実装定義の動作の違いは?


未定義の動作は、C++仕様で定義されていない動作です。たとえば、i ++ + ++ iのような式に複数の単項インクリメント/デクリメント演算がある場合、それらは定義されていない動作になります。これは、一部の言語構造が構文的に有効であるという事実によるものですが、コードの実行時の動作を予測することはできません。別の例は次の式です。u=(u ++);

実装定義の動作は、仕様で指定されていない動作であり、選択がどのように行われるかを実装者が決定して文書化するために残されます。この場合、行われた選択は保証されなければなりません。つまり、それだけが行われるべきです。

動作が指定されていない場合、C ++標準は複数の可能なパスを提供し、実装が何かを文書化または保証する必要はありません。


  1. C++の「struct」と「typedefstruct」の違いは?

    C ++では、structとtypedef structの間に違いはありません。これは、C ++では、すべてのstruct / union / enum/class宣言が暗黙的にtypedefであるかのように動作するためです。 ed、同じ名前の別の宣言によって名前が隠されていない限り。 typedefを前方宣言できないという微妙な違いが1つありますが、したがって、typedefオプションの場合、どこでも使用する前に、typedefを含むファイルを含める必要があります。

  2. C++文字列定数と文字定数の違い

    C ++では、一重引用符で囲まれた文字は文字リテラルです。文字型です。たとえば、「a」は、ASCIIベースのシステムでは値97のchar型です。 二重引用符で囲まれた1文字または文字列は、文字列リテラルを表します。これはconstchar[]型であり、文字列の長さ+1のサイズの配列を参照します。その余分な文字は文字列の終わりを示すためにあります。 文字列リテラルは、「abcdefg」のように任意の長さにすることができます。文字リテラルには、ほとんどの場合、1文字だけが含まれます。これらが印刷されるとき、文字列リテラルは、文字列で最初の\0またはNULL文字が検出されるまで印刷されます。