gpt4 book ai didi

c - C 函数中的可变参数列表 - 如何正确地遍历 arg 列表?

转载 作者:太空狗 更新时间:2023-10-29 15:01:33 24 4
gpt4 key购买 nike

在下面的 C 程序中我收到了警告:

警告 #2030:条件表达式中使用了“=”。

到底是什么问题,我该如何避免?遍历变量参数的正确方法是什么?

#include <stdio.h>
#include <stdarg.h>

int Sum(int a, int b, ...)
{
int arg;
int Sum = a + b;

va_list ap;
va_start(ap, b);

while(arg = va_arg(ap, int))
{
Sum += arg;
}
va_end(ap);

return Sum;
}

int main(int argc, char *argv[])
{
printf("%d\n", Sum(1, 2, 4, 8));

return 0;
}

最佳答案

你正在做的是惯用的,如果有点难看 C。

不过,为了让编译器相信您知道自己在做什么,您可以将赋值包含在一组额外的括号中:

while((arg = va_arg(ap, int)))

那应该处理警告。

更新:

adding parenthesis around the assignment doesn't seem to supress the warning in the C99 compiler im using (PellesC). – Gary Willoughby

什么,它没有?然后你需要让测试更明确一点:

while((arg = va_arg(ap, int)) != 0)

应该可以解决问题。也可以说它更具可读性。


你会问我“有点丑”是什么意思。

由于使用其他语言,我习惯于在测试和修改之间有明确的区分。您正在对一个值的 while 进行测试,但同时产生了副作用(即读取下一个参数)。正如我所说,这被认为是很正常的,是的,在 C 语言中是“惯用的”,因为很多 C 程序员都这样做;我认为 K&R 中甚至有类似代码的示例。

根据个人喜好,我可能会将其重写为:

while (1) {
arg = va_arg(ap, int);
if (!arg) break;
...
}

这清楚地将赋值与测试分开,并让循环作为(潜在的)无限循环独立存在。许多人会认为我的代码更难看;正如我所说,这是个人喜好问题。

关于c - C 函数中的可变参数列表 - 如何正确地遍历 arg 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1991742/

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