gpt4 book ai didi

c - 使用函数参数作为变量

转载 作者:太空宇宙 更新时间:2023-11-04 05:16:28 26 4
gpt4 key购买 nike

在函数内部重新分配函数参数是不好的还是好的做法,或者可能是未定义的行为?

让我用一个例子来解释我想做什么,这里是函数:

void
gkUpdateTransforms(GkNode *node /* other params */) {
GkNode *nodei;

if (!(nodei = node->chld))
return;

do {
/* do job */
nodei = nodei->next;
} while (nodei);
}

备选方案:

void
gkUpdateTransforms2(GkNode *node /* other params */) {

/* node parameter is only used here to get chld, not anywhere else */
if (!(node = node->chld))
return;

do {
/* do job */
node = node->next;
} while (node);
}

我检查了程序集输出,看起来是一样的,我们不需要在第二个中声明变量。您可能会问,如果参数类型更改但第一个条件相同,因为它也需要更新怎么办。

编辑:参数是按值传递的,我的意图不是编辑指针本身

EDIT2:递归函数呢?如果 gkUpdateTransforms2 是递归的会发生什么?我很困惑,因为函数会调用自己,但我认为在每次调用中,参数都会不同堆栈

最佳答案

我不知道您为什么认为这是未定义的行为——事实并非如此。这主要是编码风格的问题,没有明显的对错。

通常,将参数视为 immutable objects 是一种很好的做法.保留函数输入的未修改副本很有用。出于这个原因,使用只是参数副本的局部变量可能是个好主意。如您所见,这不会对性能产生丝毫影响 - 编译器将优化代码。

不过,写入参数也没什么大不了的。这也是常见的做法。称这样做是不好的做法是非常迂腐的。

一些迂腐的编码风格将所有不应该被修改的函数参数都设为const,但我个人认为这只是一种混淆,使代码更难阅读。在您的情况下,这种迂腐的风格将是 void gkUpdateTransforms(GkNode*const node)。不要与 const 正确性混淆,后者是普遍的好事,而不仅仅是样式问题。


但是,您的代码中有些东西绝对被认为是不好的做法,那就是条件内赋值。尽可能避免这种情况,这很危险并且会使代码更难阅读。大多数情况下没有任何好处。

混淆 === 的危险在 C 的历史早期就被注意到了。为了解决这个问题,在 1980 年代人们想出了 brain-damaged像 "yoda conditions" 这样的东西.然后在 1989 年左右出现了 Borland Turbo C,它有一个奇特的警告功能“可能不正确的分配”。这就是 Yoda 条件的死亡,从那时起编译器就警告不要在条件中赋值。

确保您当前的编译器对此发出警告。也就是说,确保不要使用比 1989 年的 Borland Turbo 更差的编译器。是的,市场上有更差的编译器。

(gcc 给出“警告:建议在用作真值的赋值周围加上括号”)


我会把代码写成

void gkUpdateTransforms(GkNode* node /* other params */) 
{
if(node == NULL)
{
return ;
}

for(GkNode* i=node->chld; i!=NULL; i=i->next;)
{
/* do job */
}
}

这主要是为了使代码更具可读性而进行的样式更改。它不会提高性能。

关于c - 使用函数参数作为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47920773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com