在作业中使用后缀/后缀运算符

samuelbrody1249

在赋值运算符的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++));
史蒂夫·萨米特(Steve Summit)

让我们看看几种不同的情况。

(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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何调用后缀运算符++?

来自分类Dev

在C99中的复合文字中使用后缀/前缀增量运算符

来自分类Dev

为什么javac在类上使用后缀“ ++”运算符创建未使用的变量?

来自分类Dev

编译器如何使用后缀运算符处理return语句?

来自分类Dev

编译器如何使用后缀运算符处理return语句?

来自分类Dev

为什么在int.parse(“ 1”)之后不允许使用后缀增量(++)运算符?

来自分类Dev

流插入结合后缀运算符

来自分类Dev

前缀和后缀运算符Java

来自分类Dev

前缀和后缀运算符C ++

来自分类Dev

libstd ++后缀运算符挂起

来自分类Dev

C++ 重载后缀运算符

来自分类Dev

Java:前置,后缀运算符优先级

来自分类Dev

C ++ 14中std :: string的运算符后缀

来自分类Dev

'|' 不是后缀一元运算符

来自分类Dev

带后缀增量的三元运算符分配

来自分类Dev

后缀和前缀运算符的行为(Java)

来自分类Dev

后缀一元运算符到底何时发生?

来自分类Dev

Java中前缀和后缀++运算符之间的区别

来自分类Dev

C#中的前缀和后缀运算符重载

来自分类Dev

反向波兰表示法中的变长运算符(后缀)

来自分类Dev

C ++抽象基类后缀运算符

来自分类Dev

C ++ 14中std :: string的运算符后缀

来自分类Dev

难以理解Javascript中的后缀增量运算符

来自分类Dev

澄清迭代器上的后缀/前缀运算符

来自分类Dev

后缀和前缀运算符的行为(Java)

来自分类Dev

'|' 不是后缀一元运算符

来自分类Dev

通过前缀和后缀运算符递增数字

来自分类Dev

C#中的前缀和后缀运算符重载

来自分类Dev

C++ 后缀运算符优先级与布尔 AND