Да. Стандарт 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
с pattern [j++]
, и используя значение j
в string [i + j]
. Побочный эффект j++
не секвенирован относительно вычисления значения i + j
. Так что это классическое неопределенное поведение.
Где 'i' объявлено/начато? –
@MartinJames Это не имеет значения. – nos
Возможно, вы найдете [этот вопрос] (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points?rq=1) интересное чтение. – WhozCraig