背面にタイプするのはなぜ行くの言語

異なることはありません。しかし、より明確に理解するためです。

ロブ・パイクGoは、一度この問題(オリジナル住所:公式ブログで説明http://blog.golang.org/gos-declaration-syntax)以下のように、簡単な翻訳は(翻訳レベルで間違っては私を許し制限)です:

はじめに

ゴー新しい言語多くの場合、非常に困惑なぜ宣言言語(宣言構文)の構文と伝統的なC言語の家族とは異なります。このブログでは、我々は比較を行い、その答えを行います。

C構文

まず、Cの構文を見てみましょう。Cは賢いと異例の宣言構文を使用しています。あなたは変数を宣言すると、単にターゲット変数名で式を記述して、それ自体が式に入力できる式を指定します。例:

  intがX;

上記のコードでは、変数x、およびint--すなわち、式X INTのタイプを宣言する。一般的には、新しい変数の型を指定するために、私たちは基本的なタイプのいくつかの種類に属し、値を結果としてこの式の操作を宣言するために我々が持っている変数を含む式を記述する必要があり、我々は書かれた表現のこの基本的なタイプの呼び出し彼は左。だから、次の文:

  int型* P;
int型A [3];

pがあるためint型のint型のポインタ、* p型であることを示します。そして、[3]のようにint型の配列は、(インデックス値がここに表示され、それが唯一の配列の指定された長さのためである気にしない)int型です。

次に、我々は、関数宣言の場合を見てください。次のようにパラメータの種類に関するC関数宣言は、括弧の外に書かれている:

  INTメイン(ARGC、ARGV)
; int型ARGC
のchar * ARGVを[]。
{/ * ... * /}

上述したように、我々は関数は、式メインので(ARGC、ARGV)intを返し主な理由を見ることができます。現代の表記では、我々はそう書かれています:

  int型のmain(int型のargc、char型* ARGV []){/ * ... * /}

それは少し違うように見えますが、基本的な構造は同じですが。
タイプは比較的単純であるとき全体的に、Cの構文は非常に賢いです。しかし残念ながら、複雑度開始の種類、このC構文すぐに人々が混乱しました。そのような関数ポインタとして顕著な例として、私たちが書き込まれる必要がありますので、以下のように:

  int型(* FP)(int型A、int型B);

ここで、fpは理由へのポインタである理由である。なぜならあなたは((* FP)を書き込む場合、 B)この式は、int型を返す関数を呼び出します。自身のパラメータFPは、何が起こるかの関数である場合は、いつ?

  INT(* FP)(INT( * FF)(int型のx、int型のY)、INT B)

これは難しい読み取るを指すことができます。
:もちろん、私たちは、主な機能は次のように宣言することができるので、パラメータの名前を指定する機能をされて宣言することはできません

  intはメイン(int型、char型* [])

リコールARGVを下回っているの前にいること

  のchar * ARGV []

あなたが持っていますあなたは「中」から見つからない変数名を宣言して、構造のその変数の型を削除しますか?それは明らかではありませんが、あなたも必要性は、変数の型の名前の途中に挿入する変数の* []型、charとして宣言しますが。
私たちは名前を付けていない場合は何が起こるかFPのパラメータを見て:

  int型(* FP)(int型(*)(int型、int型)、int型)

これは、もともとの真ん中に置かれたパラメータの名前覚えてないだけの場所を理解することは困難なものである

  int型(*)(int型、int型 )

それは関数ポインタの宣言であることが判明した場合でも、より多くの混乱の嘘でも疑問に思っているかもしれない場所を。私たちは、その後、戻り値は、関数ポインタ型であるかどうかを確認することは、次に何が起こるのだろう

  int型(*(* FP)( int型(*)(int型、int型)、int型))(int型、int型)

上見ることがすでに困難ですfpが宣言されています。
また、この例よりも複雑に構築することができますが、導入されたCの構文の文の複雑さのいくつかを説明するのに十分でした。
型宣言の構文と文法のためには、解析式と真ん中に、同じであることが指摘されるもう一つのポイントは、難易度のいくつかの型であってもよいです。理由Cキャストで、いつものように、括弧内に入力しなければならない理由は、これがある

  (INT)M_PI

ゴー文法

の言語の非Cファミリー通常、文の中で異なるタイプの構文を使用します。通常はその後、多くの場合、コロン、最初の名前を表示されます。この書き込みによると、例では、次の私たちがなり、上記引用

  X-は:int型
int型へのポインタ:P-
アレイ[3]のINT:Aを

あなたにだけ-明らかであるとき、少なくとも、このような文でも、やや長い場合は、ライン上で左から右に読むことができます。囲碁言語プログラムを基礎として使用されるが、シンプルさの追求、囲碁言語は、コロンを失い、キーワードの一部を削除し、次のとなっている:

  X-INTを
p型* INT
A [3] INT

[3]でint型の使用状況や表現は直接的な対応(次のセクションでは、我々は問題ポインタを議論するために戻ってくる)ではありません。この時点では、用語の明確性を高めるために、コードを得るが、コストは文法上の異なる扱いをする必要があります。
私たちは関数を考えてみましょう。囲碁の言語が、主な機能は、ほとんどの引数ではありませんが、聞かせてのは、転写産物の主な機能は前にそれをコピー宣言:

  FUNCメイン(int型のargc、argvの* []バイト)int型

一見およびCは、左から、しかし、違いはありません言葉に右の悪いをお読みください。
主な機能は、ポインタとint型を受け取り、intを返します。
それは混乱は発生しませんので、いつものようにパラメータ名タイプの前に-この時点でパラメータ名を削除した場合、それは非常に明確です。

  メインFUNC(int型、* []バイト)int型

左から、この文の右のスタイルに値をタイプがより複雑になった場合、それはまだ比較的簡単であるということです。ここで、変数関数の宣言(C言語の関数ポインタに対応する)である

  F FUNC(FUNC(INT、INT)INT、INT)INT

:またはそれが機能返し

  F FUNC(FUNC(INT、INT)INTは、 int型)FUNC(int型、int型) int型

の文上記は、左から右へ、読むことが非常に明確であるが、正確に一つは、現在の変数名を理解することも容易で宣言されているとする-変数名が最初の場所では常にあるので。
タイプ構文式の構文とどのくらい移動言語の違いも簡単このようなクロージャを呼び出し:

  SUM:(3 ,. 4)= FUNC(A、BのINT)INT {A + B}リターン

ポインタ

ポインタいくつかの例外。なお、配列(アレイ)内のスライス(スライス)、左タイプにブラケットに型構文移動が、角括弧構文の発現が、右側に配置:

  VaRのA [] INT
X = A [1]

同様に、移動ポインタはC *表記法に従うが、我々はまた、あなたが変数名を宣言するときに、右ではなく、式の中で*書き込みが、*左左を配置する必要があります:

  VARのp * int型
X- * = pは

、以下のように記述することはできません

  VAR pを* int型
X- = P *

*かもしれないが、混乱させ、乗算接尾辞、多分私達はこのようにパスカルの^マークを、使用することができますので

  ^ int型のvar P
X-Pを^ =は、

多分私たちは本当にすべきこのようものの、種類及び表現は、*接頭辞は、例えば、実際にはもう少し複雑行うには良いものであるため、^ *(記号のコースも変更XOR演算を持っているのように変化する)に上記のように我々は次のように書くことができます

  [] int型(「こんにちは」)

が、タイプは*の始まりである場合、変換中に、あなたは括弧を追加する必要があります

  (int型*)(ゼロ)

私たちはポインタで1日をあきらめて喜んでいる場合*文法は、上記ブラケットを省略することができます。
目に見える、移動、およびCポインタ構文が似ています。しかし、我々は完全にブラケットを追加する表現の必要性のあいまいさや種類を避けるために、時には文法の状況を避けることができないことを、この類似性にも手段。
欠点にもかかわらず、すべてのすべてで、私たちはCの簡単よりゴーのタイプの構文が理解していることを信じています。タイプはより複雑である場合は特に。

https://www.cnblogs.com/lvdongjie/p/6511124.html

おすすめ

転載: www.cnblogs.com/findumars/p/11832791.html