1

次のステートメントがあり、コンパイルされます。

static unsigned char CMD[5] = {0x10,0x03,0x04,0x05,0x06};

int Class::functionA(int *buflen)
{
    ...
    int length = sizeof(CMD); + *buflen; // compiler should cry! why not?
    ...
}

コンパイラ エラーが発生しないのはなぜですか?

4

3 に答える 3

8
+ *buflen;

の単項演算子の有効なアプリケーションであり、+基本int&的にはnoopです。これを書いたのと同じです:

int i = 5;
+i; // noop

単項演算が整数に対して実際に何をするか、そしてここで実際にそれを使って何ができるかについては、ここを参照してください。operator+

于 2012-02-07T10:23:19.533 に答える
4

それは間違っていないので、効果のないステートメントだけです。

フラグ-Wallを指定して(gcc / g ++)をコンパイルすると、表示されます。

于 2012-02-07T10:25:41.420 に答える
4

この質問のタイトル「セミコロンの後に別のコマンドをコンパイルすると」から、1行に1つのコマンド/ステートメントしかないと思いますか?

お気づきのとおり、これは誤りです。C++ と C は自由形式の言語です(つまり、記号を好きなように配置できます)。セミコロンは単なるステートメント ターミネータです。

書いfoo();bar();たり、

foo();
bar();

両方 (およびそれ以上) の配置はまったく問題ありません。ちなみに、これは機能であって、バグではありません。一部の言語 (Python、初期の Fortran) にはそのプロパティがありません。

他の人が正しく指摘しているように、あなたの特定のステートメントはノーオペレーションであり、効果のないステートメントです。一部のコンパイラはそれについて警告する場合がありますが、1 行に複数のステートメントがあることを警告するコンパイラはありません。

于 2012-02-07T10:35:46.717 に答える