从不改变表达式中的状态

Never change state within an expression

首先,我想与您分享 this Github 上的存储库,其中提到了当前使用 C 编程的一些良好实践。这里提到:

Never change state in an expression [...]

在这方面,我想知道有什么区别。

trie_add( *child, ++word );     // Bad

trie_add( *child, word + 1 );   // Good

有人可以更详细地解释一下吗?

一般来说,如果你使用

 trie_add( *child, ++word );

word 以预增量的形式产生副作用。在许多情况下,使用这种方法会导致 undefined behavior because of the lack of a sequence point.

然而,调用

trie_add( *child, word + 1 );

word没有副作用。

FWIW,这两个调用都将相同的 传递给被调用函数。

也就是说,澄清一下,引用的声明只是另一种观点,而不是任何 规则。在这个具体例子中,两者都很好。

Never change state in an expression

这太严格了。如前所述,trie_add( *child, ++word );.

没有什么不好的

但必须谨慎,因为在 trie_add2( *child, ++word, ++word ); 中计算顺序不固定,因此编译器可以自由生成 trie_add2( *child, word+1, word+2);trie_add2( *child, word+2, word+1);