C言語でのsizeofの詳細についての3点分析を紹介します。

1241 ワード

1.sizeofは演算子であり、加減乗除の性質は同じです。コンパイルする時に実行します。運転時に実行するのではありません。もしプログラミング中にこの点を検証したら?ps:これは先日の友達のタオバオ面接の問題です。                  1 sizeofの++iの副作用は表示されていません。理由は一つだけあります。コンパイル時にsizefが実行された後、+iが処理されました。+iの副作用が除去されました。サイゼフが運転中に行う場合は+iに注意しなければなりません。実際にはsizeofの実現はマクロで行うべきで、マクロはコンパイル時に実行します。具体的な実現は以下の通りです。
2.sizeof('a')C言語の結果は4で、C++の結果は1で、ある文章を見たことがあります。Cの中でsizeofは「数」に重きを置いていますが、C++の中でsizofは「文字」に重きを置いています。
3.マクロでsizeofを実現する二つの古典的なアプリケーション

#include<iostream>

using namespace std;

int main()
{
    int i=1;
    cout<<i<<endl;
    sizeof(++i);
    cout<<i<<endl;
    return 1;
}
が、最初に2つのマクロのアプリケーションを説明するために、2つの例を挙げて説明している。sizeof(int)の結果は4です2番目の最初のステートメントのサイズは4の配列int a[4]です。では、アラリですsizeof(a)の結果は16です。非配列のマクロ定義は、まず0をT*タイプのポインタが指すアドレスに変換します。そして、Tタイプのアドレスに1を加えると、Tタイプのサイズ(すなわち、非配列Tが得られたサイズ)が加算されます。前のサイゼtアドレスをint型に変換した整数だけを返します。簡単な例として、int*p;p=p+1;------pはint*タイプのポインタであり、p+1はアドレス空間に4バイトを加算したものに相当する。配列のマクロ定義については、非配列のマクロ定義と同様であり、ここでは、配列Tをユーザー定義のタイプと見なし、&Tは配列タイプのポインタを表し、配列タイプポインタに1を加えるとアドレスに配列サイズが加算されます。ユーザーがカスタマイズしたタイプなので、0を行列タイプのアドレスに強制的に変換することはできません。1を追加したアドレスで以前のアドレスを減算するだけで得られた差は配列自体が占めるバイトサイズです。