Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 永远不要更改表达式中的状态_C_Function_Function Call - Fatal编程技术网

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 )

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

从不更改表达式中的状态[…]

在这方面,我想知道两者的区别是什么

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 );