在赋值运算符的lh上有一个post / prefix运算符可以接受吗?
#include<ctype.h>
void to_upper_in_place(char* string)
{
while(*string++ = toupper(*string));
}
如果可以,那么以前的代码是否属于可读的C代码,还是应该将其转换为类似于以下内容的代码?
#include<ctype.h>
void to_upper_in_place(char* string)
{
while(*string) {
*string = toupper(*string);
string++;
}
}
甚至:
while(*string = toupper(*string++));
让我们看看几种不同的情况。
(1)(具有两个不同的指针)
*dest++ = toupper(*src++);
这是完美的普通C风格。
(2)
*dest = toupper(*src);
src++;
dest++;
这是“纵向”风格。如果您害怕++
以危险的方式使用它,则可以编写它。(正如我们将要看到的,一定要谨慎行事。)
(3)(返回到lhs和rhs上的同一指针)
*p = toupper(p);
p++;
这可以。
(4)
*p++ = toupper(*p);
这是有问题的,因为p
在同一个表达式中使用和修改了它们,而修改不取决于所使用的值。在许多/大多数情况下,此模式使表达式变为undefined,这是一件坏事。最终很难说出这个具体情况实际上是不确定的,但是由于这个原因,我们必须保持安全,并说(3)是可取的。(欲了解更多-多更多-在这种不确定的行为,看到这个陷入困境的老问题。)
(5)
*p = toupper(*p++);
更糟的是。同样,它也有可能未定义,但是如果它完全起作用,可能会增加p
得太早。
(6)另一种安排是通过使用for
循环代替将增量放入循环头中:
for(; *p; p++)
*p = toupper(*p);
也可以
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句