gpt4 book ai didi

c - 为什么 Cert-C 禁止在 while 循环声明中赋值?

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

假设我想在 C 中循环遍历一个列表。有两种常用的方法可以做到这一点。

/* method a */
while (ptr = ptr->next) { /* do stuff */ }

/* method b */
ptr = head;
while (ptr) { /* do stuff */ ptr = ptr->next; }

CERT-C bans method A .为什么是这样?当然 B 需要更多的手动编码来记住在所有可能的循环点进行迭代(如果某些节点无效,函数可能需要继续)并且方法 A 保证一致的迭代。

最佳答案

使用 = 运算符的赋值很容易与等式 == 运算符混淆。这部分文本清楚地表明了这一点:

Although the intent of the code may be to assign b to a and test the value of the result for equality to 0, it is frequently a case of the programmer mistakenly using the assignment operator = instead of the equals operator ==.

我同意在 while 循环的情况下——您期望每个循环都采用下一个元素——对于有经验的编码人员来说,这种令人惊讶的元素并不存在。对于新编码员来说,它可能仍然是错误的。他们要么将赋值错误地用于测试相等性,要么他们没有直接看到表达式的结果何时为 0


我会确保表达式写成 while (ptr != NULL) 因为这样意图最清楚,并且表达式没有任何副作用。你可以使用 while ((ptr = ptr->next) != NULL) 如果你在选择语句中允许一个单一的副作用(我自己更喜欢术语“流控制语句”,但那更多类 Java)。

我自己会远离 while ((ptr = ptr->next)) 中的附加括号,因为这可能会被误认为草率,代码美化器可能会警告不要使用不必要的括号。

关于c - 为什么 Cert-C 禁止在 while 循环声明中赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52123304/

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