从不改变表达式中的状态
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);
首先,我想与您分享 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);