我的编译器警告:operation on j may be undefined
这是C代码:
for(int j = 1; pattern[j] != '\0' && string[i] != '\0';){
if(string[i+j] != pattern[j++]){//this is on the warning
found = 0;
break;
}
}
那是未定义的吗?
我的编译器警告:operation on j may be undefined
这是C代码:
for(int j = 1; pattern[j] != '\0' && string[i] != '\0';){
if(string[i+j] != pattern[j++]){//this is on the warning
found = 0;
break;
}
}
那是未定义的吗?
是的。C11 标准在 §6.5 中说:
If a side effect on a scalar object is unsequenced relative to either a different
side effect on the same scalar object or a value computation using the value of the
same scalar object, the behavior is undefined. If there are multiple allowable
orderings of the subexpressions of an expression, the behavior is undefined if such
an unsequenced side effect occurs in any of the orderings.
在这里,在比较
if(string[i+j] != pattern[j++])
您既要增加j
with的值pattern [j++]
,又要使用j
in的值string [i + j]
。的副作用j++
与值计算无关i + j
。所以这是典型的未定义行为。