C 永远不要更改表达式中的状态
首先,我想与您分享Github上的存储库,其中提到了当前使用C编程的一些良好实践。这里提到: 从不更改表达式中的状态[…] 在这方面,我想知道两者的区别是什么C 永远不要更改表达式中的状态,c,function,function-call,C,Function,Function Call,首先,我想与您分享Github上的存储库,其中提到了当前使用C编程的一些良好实践。这里提到: 从不更改表达式中的状态[…] 在这方面,我想知道两者的区别是什么 trie_add( *child, ++word ); // Bad 及 有人能更详细地解释一下吗?如果你使用 trie_add( *child, ++word ); 单词具有预增量形式的副作用。在许多情况下,使用这种方法会因为缺乏有效的解决方案而导致错误 然而,电话 trie_add( *child, word + 1 )
trie_add( *child, ++word ); // Bad
及
有人能更详细地解释一下吗?如果你使用
trie_add( *child, ++word );
单词
具有预增量形式的副作用。在许多情况下,使用这种方法会因为缺乏有效的解决方案而导致错误
然而,电话
trie_add( *child, word + 1 );
对word
没有副作用
FWIW,两个调用都将相同的值传递给被调用函数
也就是说,为了澄清问题,引用的声明只是另一种观点,而不是任何规则。在这个特定的示例中,这两种方法都很好
永远不要改变表达式中的状态
这太严格了。如前所述,trie_add(*child,++word)中没有什么不好的地方代码>
但我们必须谨慎,如在trie_add2(*child,++word,++word)代码>求值顺序不是固定的,因此编译器可以自由地生成trie_add2(*child,word+1,word+2)的等价项代码>或trie_add2(*子项,单词+2,单词+1)
第一个更改作为副作用的word
的值。这是好是坏是基于意见的。在两个语句之后打印word
的值,您将看到差异。那么这是坏吗-Pi不同意文章中的许多观点,请不要把它当作神圣的事实。谢谢你的回答,现在我明白了,在表达式中没有看到序列点的必要性,因为我看不到 FoO(A++,B++,C++,D+)的需要;代码>@pmg-right先生,这里没有,但是如果第一种方法在单个变量上使用了不止一次,那么它将导致一个问题。无论如何,第二种方法(如+1
,+2
)是安全的。
trie_add( *child, word + 1 );