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

发布于 2025-01-10 21:56:47 字数 720 浏览 0 评论 0原文

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

这是我的代码: 尝试一下

#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) { }

然后,请告诉我错过了什么?

I have a code which print pointer to const char, or I mean a string, recursively.
My code works fine when I'm using += operator to call print() function. But, when I'm using ++ operator my code goes to an infinite loop just printing 'H'.

Here's my code: 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;
}

I know that in any loop for an example:

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

is completely equivalent to

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

Then, please tell what I'm missing out?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

段念尘 2025-01-17 21:56:47

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

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

C 标准中的预自增运算符 ++ (6.5.2.4 后缀自增和自减运算符)

2 后缀++运算符的结果是
操作数。
作为副作用,操作数对象的值是
递增(即,将适当类型的值 1 添加到
它)。

对于 for 循环

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

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

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

You are using the (postfix) post-increment operator ++ the value of which is the value of the operand before incrementing. So you are calling the function with the same value of the pointer. You need to use the pre-increment operator ++

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

From the C Standard (6.5.2.4 Postfix increment and decrement operators)

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).

As for the for loop

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

then the value of the expression i++ is not used. The variable i is used after applying the side effect of incrementing it by the operator. To check this you could write the for loop the following way

for(size_t i = 0; i < 10; printf( "%zu ", i++ ) ) { }
無處可尋 2025-01-17 21:56:47

s++ 是后置增量。它返回 s 的原始值,而不是增加的值。这意味着这

print(s++);

相当于

print(s);
s++;

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


要在递增后获取 s 的值,请使用预递增。

print(++s);

这相当于

++s;
print(s);

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

print(s+1);

s++ is a post-increment. It returns the original value of s, not the incremented value. This means that

print(s++);

is equivalent to

print(s);
s++;

Since print(s) calls print(s), you get an infinite loop.


To get the value of s after it's been incremented, use a pre-increment.

print(++s);

This is equivalent to

++s;
print(s);

Finally, there's no reason to change s. You should simply use

print(s+1);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文