后缀 ++ 运算符在 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
是字符串长度,所以你有一个差一错误。
我已经为 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
是字符串长度,所以你有一个差一错误。