这是后缀增量运算符的工作原理

时间:2013-06-30 06:58:01

标签: c

我正在解决一个读取一组文本行并打印时间最长的问题。 问题来自 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');
}

4 个答案:

答案 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。此外,您的索引值将相互偏离,这是因为如果变量在语句评估的一部分期间发生更改,那么这些更改将立即显示到尚未评估的语句部分。