`++` 和 `+=` 运算符的行为不同

`++` and `+=` operator are behaving differently

我有一个代码可以递归地打印指向 const char 的指针,或者我的意思是 string。 当我使用 += 运算符调用 print() 函数时,我的代码工作正常。但是,当我使用 ++ 运算符时,我的代码进入无限循环,只打印 'H'.

这是我的代码:TRY IT

#include <stdio.h>

void print(const char *s){
    if(*s == 0)
        return;
    putc(*s, stdout);
    print(s += 1); // infinite loop when `s++`
}

int main(void){
    print("Hello");
    return 0;
}

我知道在任何循环中举个例子:

for(size_t i = 0; i < 10; i++) { }

完全等同于

for(size_t i = 0; i < 10; i += 1) { }

那么,请告诉我我遗漏了什么?

您正在使用(后缀)post-increment 运算符 ++,其值是递增前操作数的值。因此,您正在调用具有相同指针值的函数。您需要使用 pre-increment 运算符 ++

void print(const char *s){
    if(*s == 0)
        return;
    putc(*s, stdout);
    print( ++s ); 
}

来自 C 标准(6.5.2.4 后缀递增和递减运算符)

2 The result of the postfix ++ operator is the value of the operand. As a side effect, the value of the operand object is incremented (that is, the value 1 of the appropriate type is added to it).

至于for循环

for(size_t i = 0; i < 10; i++) { }

则不使用表达式i++的值。变量 i 在应用运算符递增它的副作用之后使用。要检查这一点,您可以按以下方式编写 for 循环

for(size_t i = 0; i < 10; printf( "%zu ", i++ ) ) { }

s++ 是一个 post-increment。它returns是s的原始值,不是增加后的值。这意味着

print(s++);

等同于

print(s);
s++;

由于 print(s) 调用 print(s),你得到一个无限循环。


要在递增后获取 s 的值,请使用 pre-increment.

print(++s);

这相当于

++s;
print(s);

最后,没有理由改变s。你应该简单地使用

print(s+1);