我有以下声明并编译:
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?
...
}
为什么我没有编译错误?
答案 0 :(得分:8)
+ *buflen;
+
上的一元int&
运算符的有效应用,它基本上是一个noop。就像你写这个一样:
int i = 5;
+i; // noop
答案 1 :(得分:4)
因为它没有错,只是一个没有效果的陈述。
如果使用标志-Wall编译(gcc / g ++),你会看到。
答案 2 :(得分:4)
我想从这个问题的标题“分号后另一个命令并编译”你认为每行只能有一个命令/语句?
正如您所注意到的,这是错误的。 C ++和C是free-form languages(这意味着您可以以您认为合适的任何方式排列符号)。分号只是一个语句终止符。
您可以写foo();bar();
或
foo();
bar();
两种(和更多)安排都完全没问题。顺便说一下,这是一个功能,而不是一个bug。有些语言(Python,早期的Fortran)没有这个属性。
正如其他人正确指出的那样,您的具体陈述是无操作的,没有任何影响的陈述。有些编译器可能会警告你 - 但是没有编译器会在一行上警告你多个语句。