在以下C程序中,我收到警告:
warning #2030: '=' used in a conditional expression.
究竟是什么问题,我该如何避免这个?迭代变量参数的正确方法是什么?
#include#include 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; }
Carl Smotric.. 5
你做的是惯用的,如果有点丑陋C.
但是,为了说服编译器您知道自己在做什么,可以将赋值包装到另外一组括号中:
while((arg = va_arg(ap, int)))
那应该照顾警告.
更新:
在赋值周围添加括号似乎并没有在使用(PellesC)的C99编译器中抑制警告. - 加里威洛比
什么,它没有?然后你需要让测试更加明确:
while((arg = va_arg(ap, int)) != 0)
应该做的伎俩.它也可以被认为更具可读性.
你会问"我有点丑陋".
从使用其他语言开始,我习惯于在测试和修改之间进行明确的分离.您正在while
对某个值进行测试,但同时会产生副作用(即在下一个参数中读取).正如我所说,这被认为是很正常的,因为很多C程序员都这样做,所以在C语言中是"惯用的"; 我认为K&R甚至有类似代码的例子.
根据个人喜好,我可能会将其重写为:
while (1) { arg = va_arg(ap, int); if (!arg) break; ... }
这清楚地将赋值与测试分开,并使循环独立于(可能)无限循环.很多人会认为我的代码更难看; 正如我所说,这是个人偏好的问题.
你做的是惯用的,如果有点丑陋C.
但是,为了说服编译器您知道自己在做什么,可以将赋值包装到另外一组括号中:
while((arg = va_arg(ap, int)))
那应该照顾警告.
更新:
在赋值周围添加括号似乎并没有在使用(PellesC)的C99编译器中抑制警告. - 加里威洛比
什么,它没有?然后你需要让测试更加明确:
while((arg = va_arg(ap, int)) != 0)
应该做的伎俩.它也可以被认为更具可读性.
你会问"我有点丑陋".
从使用其他语言开始,我习惯于在测试和修改之间进行明确的分离.您正在while
对某个值进行测试,但同时会产生副作用(即在下一个参数中读取).正如我所说,这被认为是很正常的,因为很多C程序员都这样做,所以在C语言中是"惯用的"; 我认为K&R甚至有类似代码的例子.
根据个人喜好,我可能会将其重写为:
while (1) { arg = va_arg(ap, int); if (!arg) break; ... }
这清楚地将赋值与测试分开,并使循环独立于(可能)无限循环.很多人会认为我的代码更难看; 正如我所说,这是个人偏好的问题.