2011-11-16 10 views
7

C/C++構文 - ステートメントを、の代わりに;で区切ります。法的?

コンパイルしてうまく動作します。

delete a; 
a = 0; 

なぜ、この場合に許可されているステートメントを分離しているのですか?

ありがとう:)

+3

これはコンマ演算子と呼ばれます。http://www.cplusplus.com/doc/tutorial/operators/ –

+2

それは答えではなく、コメントでなければなりません。 – Mysticial

+0

もちろん、ここの例はC++ではなく、C. :-) – ibid

答えて

6

これはカンマ演算子です。引数の両方を評価し、2番目の引数を返します。

+0

@Mankarse:すでに修正されました。ありがとう。 –

5

これはカンマ演算子です。式を区切るのに使用できますが、宣言は区切りません。 CおよびC++で

+0

カンマで同じタイプの宣言を複数導入することができます。 –

7

、ほとんどの "文" は実際に表現されています。式に追加されたセミコロンは、ステートメントになります。代わりに、コンマ演算子で副作用のある式を分離することができます(左辺の式はその副作用について評価され(その値は破棄されます)、右辺-side式の値が評価されます。 comma operatorある

5

。 MSDNの記事はhereです。それがどのように動作するかを理解するために、this質問をご覧ください。

1

それはそのようなコードを記述することは可能であるが、それは幾分奇妙であってもよいです。次のように少しより現実的なユースケースは、あなたが構造体Tを持っていることになる場合:

struct T { 
    bool check() const; 
    void fix(); 
}; 

を今、あなたは、構造体のすべてを反復処理し、その上でチェックを実行して、チェックがfalseを返した場合は修正呼びたいです。これを行う簡単な方法は、

for (list<T>::iterator it = mylist.begin(); it < mylist.end(); ++it) 
    if (!it->check()) 
     it->fix(); 

可能な限り短く書くようなふりをしましょう。 fix() voidを返すということは、それを単に条件に入れることができないことを意味します。しかし、あなたがこの問題を回避することができコンマ演算子を使用して:

for (auto it = mylist.begin(); it != mylist.end() && (it->check() || (it->fix(), true)); ++it); 

私は特に正当な理由なしにそれを使用しないだろうが、それはあなたが便利なことができた状態から任意の関数を呼び出すことができません。

関連する問題