2011-12-30 10 views
11

このコード:int&aとint&aに違いはありますか?

int a = 5; 
int& b = a; 
b = 7; 
cout << a; 

7アウトプリント、及びint &bint& bを置き換えるも実際にそうint&bint & bとを行い7

プリントアウトします。

この種の動作は、単純なクラスでもテストしました。一般に、アンパサンドが型と識別子に関連して配置されるかどうかは重要ですか?ありがとう。

+1

いいえ違いはありません。 – Nerdtron

答えて

15

いいえ、コーディングスタイル以外はまったく違いはありません。

int& a, b; 

intとしてint&bとしてaを宣言:私はコーディングスタイルについての主な引数は、この宣言があることだと思います。

+0

ありがとう、それに気をつけます。 – newprogrammer

+0

@Ryan私はint 012,が参照aが宣言されているが初期化されていないため、コンパイルエラーが発生すると思います。 – Shailesh

+0

@ Shailesh:そうです、それは 'int&a = foo、b = bar'でしょう。 – Ryan

1

コンパイラには何も書かれていません。正しいのはコードスタイルの問題です。

9

C言語のように、空白はほとんど問題ではありません。

あなたは同じ3つのトークンとして解析記載されているすべてのバージョン:

  • int
  • &
  • b

ので、彼らは、コンパイラに同じことを意味します。

空白の問題は、2つの英数字トークンを区切っているときだけであり、空白の量と種類があっても問題がない限りです。しかし、あらゆる種類の句読点は常に英数字とは別のトークンになり、空白は必要ありません。

だからあなたのコードは限り短くなることができます:

using namespace std;int a=5;int&b=a;b=7;cout<<a; 

残りの空白が必要とされています。

+0

空白が必要なときを明確にしてくれてありがとう。 – newprogrammer

+1

もう一つ重要なのはマクロ定義です。関数名と次の開いたかっこの間にスペースがない場合、マクロは関数のようなものです。存在する場合、かっこは置換リストの一部です。 –

4

一般に、アンパサンドが型と識別子に関連して配置されるかどうかは重要ですか?いつものように

int & a, b; // b is not a ref 
int const * a; // pointer to const int 
int * const a; // const pointer to int 

、空白は重要ではありません:

の例では、それは問題ではありませんが、それがない場合がありました。

1

c/C++/javaこれらの言語はスペースに敏感ではないため、違いはありません。

1

これらは2つの機能的に等価な宣言である:

int& a; // & associated with type 
int &a; // & associated with variable 

タイプ名と&又は*を関連付ける別個のポインタ型を持つプログラマの願望を反映しています。しかし、&または*を変数ではなくタイプ名に関連づけることの難しさは、形式C++の構文に従って、&*も変数のリストに分布していないということです。したがって、誤解を招く宣言が簡単に作成されます。たとえば、次の宣言は整数参照を2つではなく1つ作成します。ここ

int& a, b; 

宣言で使用される場合、&(又は*)は、それが先行する個々の変数 に、しないタイプにリンクされている、ので、bは整数(整数ない参照)として宣言されそれは続く。この宣言の問題点は、視覚的にaとbの両方が参照型であるように見えるが、aのみが参照であるため、視覚的な混乱は初心者C++のプログラマーを誤解させるだけでなく、時には経験豊かなプログラマーもまた誤解するということである。

C++コンパイラには、int &aまたはint& aを書き込むかどうかは関係ありません。しかし、混乱を避けるために、&*は型ではなく変数に関連付ける必要があります。

関連する問題