编码风格aginst警告检查

问题描述:

在全新的编译警告,我遇到了下面的代码:编码风格aginst警告检查

char *strcpy(char *dest, char *src) 
{ 
    unsigned int i; 

    while(dest[i] = src[i])//assignment in condition 
     i++; 

    return dest; 
} 

代码的基础功能应该是美好的,但编译器警告说,assignment in condition,请问这部分代码有任何潜在的风险?如果这种警告需要清理?

各种警告,需要清理。引入

此警告的原因===往往是来自程序员(你好,帕斯卡!)糊涂了,你的意图可以通过添加围绕赋值表达式的括号中明确指出:

if ((x = y)) // no warning 
+0

对于我的情况,我也尝试'while((dest [i] = src [i]))' – 2014-10-17 03:15:42

不,你不需要解决这个问题。

警告的原因是,有时人们错误地键入=时,他们的意思是==,例如,

while (response = 'n') 

在有条件的转让是更可能是这样的错误不是分配要测试其值,所以编译器警告一下。您可以通过在测试包分配沉默警告:

while ((dest[i] = src[i]) != 0) 

在另一方面,我建议你总是把whileif的体内{},哪怕它只是一个声明。见Why is it considered a bad practice to omit curly braces?

您还需要初始化i

unsigned int i = 0; 
+0

我想第二个他的意见。尽管在条件内进行赋值是合法的,但它使代码难以阅读。如果您的意图更明确,编译器优化器可能会生成相同的代码。多年前(几十年前),开发人员可以通过使用某些短手来帮助优化代码。这不再是事实。 – 2014-10-17 02:20:01

+1

糟糕的做法中最糟糕的是“不需要解决这个问题”。在之前的“成功”构建中留下的大量不太重要的警告中,您永远不会注意到实际问题。 – user3125367 2014-10-17 02:34:49

+0

虽然这可能是一般的真实情况,但这个特定的一个有一些值得注意的误报。考虑常见的'while(row = fetch_from_db())'模式。 – Barmar 2014-10-17 02:47:29