2012-02-22 19 views
1

本当に小さな問題があります。これは私が練習しようとしたポインタプログラムですが、Visual C++でエラーが発生しています。C2059:構文e r r r: ';'

#include "stdafx.h" 
#include "iostream" 
#include "string" 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char *p = "School"; 
    char c; 
    c = ++*p++; 
    cout << c << ", " << p << endl; 
    cout << p << ", " << ++*p-- << ", " << ++p*++; //Error C2059: syntax error : ';' 
    return 0; 
} 

多分それは非常にばかげた問題ですが、私はそれに私の指を置くことはできません。

+6

構文エラーの原因が何であれ、それらが明確な動作をしているかどうかにかかわらず、 '++ * p ++'と '++ * p - 'は単なる恐ろしい式です。それらを使用しないでください。 – Mat

+2

'++ p * ++'とは何ですか? – kev

+0

あなたのコード(またはあなた自身で数週間)を維持しなければならない人を分かりやすくするために、私は '++ * p - 'や '++ p * ++'のようなものを書きません。 – hochl

答えて

4

問題は、おそらくこれです:最後のcout

++p*++ 

p*を切り替えたようです。


ここでは、同じ行に副作用を持つ複数の式を使用することで問題が発生します。これで何をしようとしていますか?

c = ++*p++;

またはこれ?

cout << p << ", " << ++p-- << ", " << ++p++; //Error C2059: syntax error : ';'

これらのステートメントを評価する順序は未定義です。

+0

'++ * p ++'は未定義ではありません。 2つの異なるオブジェクトがインクリメントされるので、シーケンスポイントの問題はありません。 'p'と' * p'です。実際にコンパイルするのに似た 'cout'行はUBです。なぜなら、2つの別々の' p ++ 'は、介在するシーケンスポイントなしで実装によって順序付けられることができるからです。 –

+0

申し訳ありませんが、 '++ * p ++' *は* UBです。 'p'は文字列リテラルを指しているので、' * p'は変更できません。しかし、注文はOKです。 –

+0

詳細を教えていただけますか? –