最近cppcheck在一些C代码引发错误,即具有以下结构:是否用C预测逗号运算符和赋值的评估顺序?
((void)(value_prev = value), value = new_value())
在大多数情况下这可以被分离到2行,但是也有一些情况下,这是有用的在单个语句中。
实际上,我发现它适用于流行的编译器(GCC/Clang/MSVC),它不会给出任何警告(即使警告级别设置为最高)。
示例代码:
#include <stdio.h>
int get_next(int i);
int main() {
int i = 0, i_prev = 10;
do {
printf("%d\n", i);
} while ((void)(i_prev = i),
(i = get_next(i)) != 10);
}
CppCheck 1.73 (最新在写作时)给出了一个错误与此代码:
(error) Expression '(void)(i_prev=i),(i=get_next(i))!=10'
depends on order of evaluation of side effects`
虽然可以更改代码安静警告,这个订单真的没有定义?
难道是get_next(i)是一个宏,就像#define getnext(i)i ++? – gnasher729
不,在这种情况下,它被定义为一个函数,cppcheck在没有任何修改的情况下给出这个代码上的错误。 – ideasman42