我正在解决一个读取一组文本行并打印时间最长的问题。
问题来自 K& R “C编程语言”第1.9节。本书提供了一个解决方案,但我试图以自己的方式解决它。下面的代码有效,但在我开始工作之前,由于我之前使用的 longestStr[i++] = tmpStr[j++]
,我遇到了问题 longestStr[i++] = tmpStr[i++]
认为一旦完成作业, i
就会增加。但事实并非如此。这是后缀运算符通常如何工作的吗?
#include <stdio.h>
#define MAXLINE 100
main()
{
int lineLength = 0, longestLine = 0;
int c, i, j;
char longestStr[MAXLINE];
char tmpStr[MAXLINE];
while((c = getchar()) != EOF)
{
tmpStr[lineLength++] = c;
if(c == '\n')
{
if( lineLength > longestLine)
{
longestLine = lineLength;
i = 0, j = 0;
while(i < lineLength)
{
longestStr[i++] = tmpStr[j++]; // I tried longestStr[i++] = tmpStr[i++] but it gives wrong result
}
}
lineLength = 0;
}
}
printf("Longest line is - %d long\n", longestLine-1);
for(i = 0; i < longestLine-1; i++)
printf("%c", longestStr[i]);
putchar('\n');
}
答案 0 :(得分:3)
后缀增量或减量是在使用变量后执行增量或减量的运算符,这样如果您希望使用整数值打印并在使用后缀的同时添加它。
int i = 0;
printf("%d",i++);
//prints out 0
然而,前缀递增/递减以相反的方式工作,使得它在使用变量之前执行递增/递减,这样如果您希望在打印出变量之前递增/递减变量,则可以使用前缀< / p>
int i = 0;
printf("%d",++i);
//prints out 1
答案 1 :(得分:1)
尝试了解修复后增量的工作原理。
f(i ++)相当于'对i的当前值调用f',然后递增i'
例如,当您使用i ++两次,初始值为i = 1
时,a(i++) = b(i++)
表示a(1)=b(2)
,操作后的i值为i=3
。< / p>
如果要在要执行的操作中删除一个变量,则必须确保仅使用一次增量。这样做,a(i)=(b(i); i++
答案 2 :(得分:1)
您遇到的问题与后缀运算符的工作原理无关,而是与您打算在代码行中执行的操作有关。
正如评论中所要求的那样,这行最初是什么意思?
longestStr[i++] = tmpStr[i++];
因为C标准没有指定它,所以可以用以下几种方式解释这一行:
longestStr[i] = tmpStr[i+1];
i += 2;
或
longestStr[i+1] = tmpStr[i];
i += 2;
或
longestStr[i] = tmpStr[i];
i += 2;
在每种情况下,你最终会增加两次计数器,这会弄乱你的算法。
正确的方法是在单独的行中增加计数器,或者使用工作解决方案(您提供的),应该使用任何体面的编译器将其编译为相同的代码。
请注意,您应该检查计数器是否超出允许的最大行数MAXLINE
(除非问题表明输入不会发生这种情况,但即使在这种情况下,它也会对情况有所帮助和你的一样,代码错误地将计数器递增两次)。
答案 3 :(得分:0)
虽然后缀增量运算符评估原始值,但可以理解,实际的增量不会发生,直到某个时候。然而,这种情况并非如此。您应该将postfix概念化,就像在返回原始值时发生递增一样。
更大的问题是你的陈述增加了两次。这意味着我将在循环的每次迭代中增加2。此外,您的索引值将相互偏离,这是因为如果变量在语句评估的一部分期间发生更改,那么这些更改将立即显示到尚未评估的语句部分。