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;

是一元运算+符在 an 上的有效应用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

我猜从这个问题的标题“在分号后另一个命令并编译”你认为每行只能有一个命令/语句?

正如您所注意到的,这是错误的。C++ 和 C 是自由格式语言(这意味着您可以以任何您认为合适的方式排列符号)。分号只是一个语句终止符。

你可以写foo();bar();

foo();
bar();

两种(以及更多)安排都很好。顺便说一句,这是一个功能,而不是一个错误。某些语言(Python、早期的 Fortran)没有该属性。

正如其他人正确指出的那样,您的特定声明是无操作的,没有任何效果的声明。一些编译器可能会警告您 - 但没有编译器会警告您一行中有多个语句。

于 2012-02-07T10:35:46.717 回答