后缀 ++ 运算符在 While 条件下未按预期运行

Postfix ++ Operator Not Behaving As Expected Inside While Condition

我已经为 Brian Kernighan 的“C 编程语言”编写了一个简单的解决方案习题1-19,反转字符串。 reverse(char[])函数如下,一切正常;

void reverse(char src[])
{   
    int len = 0;
    while( src[len] != '[=10=]')
        len++;

    for(int i = 0; i < len/2; i++)
    {
        char temp = src[i];
        src[i] = src[len - 1 - i];
        src[len - 1 - i] = temp;
    }
}

但是,如果我在 while 循环中使用 后缀增量 (++) 运算符,函数将失败;

void reverse(char src[])
{   
    int len = 0;
    while( src[len++] != '[=11=]')      // this fails
        ;

    for(int i = 0; i < len/2; i++)
    {
        char temp = src[i];
        src[i] = src[len - 1 - i];
        src[len - 1 - i] = temp;
    }
}

唯一的区别是,我没有在 while 循环中递增变量 len,而是使用了一个后缀 ++ 运算符,其行为期望应该是 "Use the old value for conditional check, after finished increment it".

为什么没有按预期工作,我哪里做错了?我正在 Windows 10 Mingw/gcc 编译器下编译它。这是整个测试代码;

测试代码

#include <stdio.h>

#define STR_NUM     5
#define STR_SIZE    20

void reverse(char[]);   // declaration

int main()
{   
    char str[STR_NUM][STR_SIZE] =
    {
        { "A"     },
        { "AB"    },
        { "ABC"   },
        { "ABCD"  },
        { "ABCDE" }
    };

    for(int i = 0; i < STR_NUM; i++)
        reverse(str[i]);

    for(int i = 0; i < STR_NUM; i++)
        printf("%s\n", str[i]);

    return 0;
}

// this is working
void reverse(char src[])
{   
    int len = 0;
    while( src[len] != '[=12=]')
        len++;

    for(int i = 0; i < len/2; i++)
    {
        char temp = src[i];
        src[i] = src[len - 1 - i];
        src[len - 1 - i] = temp;
    }
}

// this is failing
/*
void reverse(char src[])
{   
    int len = 0;
    while( src[len++] != '[=12=]')      // this fails
        ;

    for(int i = 0; i < len/2; i++)
    {
        char temp = src[i];
        src[i] = src[len - 1 - i];
        src[len - 1 - i] = temp;
    }
}
*/

后缀自增运算符returns原值加一

while( src[len] != '[=10=]')
    len++;

在工作版本中,while 循环将在 src[len][=13=] 时终止。当 while 循环测试条件失败时,循环内的语句不执行。在循环 len 包含一个值使得 src[len] == '[=15=]'.

while (src[len++] != '[=11=]');

在您的修改版本中,当执行最终测试时,len 将增加一次。在循环 len 包含一个值使得 src[len] 是数组末尾后的一个。

但是 for 循环假设 len 是字符串长度,所以你有一个差一错误。