为什么++没有正确递增?

时间:2015-09-11 18:11:32

标签: c pointers post-increment

我写了一个简单的函数来计算目录中非隐藏文件的数量。但是我注意到当我使用++递增计数值时,我得到了奇怪的结果,比如负数和非常大的数字。当我将行*count++;切换为*count = *count + 1;时,该函数的行为与我预期的一样。有人可以解释这种行为吗?

要使用此示例程序,请将目录路径作为第一个参数传递给目录。

#include <stdio.h>
#include <dirent.h>

int count_files_directory(unsigned int *count, char *dir_path)
{
    struct dirent *entry;
    DIR *directory;

    /* Open the directory. */
    directory = opendir(dir_path);
    if(directory == NULL)
    {
        perror("opendir:");
        return -1;
    }

    /* Walk the directory. */
    while((entry = readdir(directory)) != NULL)
    {
        /* Skip hidden files. */
        if(entry->d_name[0] == '.')
        {
            continue;
        }

        printf("count: %d\n", *count);

        /* Increment the file count. */
        *count++;
    }

    /* Close the directory. */
    closedir(directory);

    return 0;
}

int main(int argc, char *argv[])
{
    int rtrn;
    unsigned int count = 0;

    rtrn = count_files_directory(&count, argv[1]);
    if(rtrn < 0)
    {
        printf("Can't count files\n");
        return -1;
    }

    return 0;
}

4 个答案:

答案 0 :(得分:6)

*count++扩展为*(count++),而非(*count)++,就像您期望的那样。您正在递增地址,而不是文件计数。

答案 1 :(得分:4)

我相信,根据operator precedence

 *count++;

应该写成

(*count)++;

否则,您的确与相反(或者,就此而言,无效)的行为比您期望的要好。

答案 2 :(得分:0)

您正在递增指针而不是变量。你需要尊重指针(count)。 更好更清洁的解决方案是简单地返回文件数而不是传递参数。 这样就无需使用指针来保存计数,并使方法签名更易于使用。

int count_files_directory(char *dir_path)
{
   int noOfFiles = 0;
   // Count files (omitted here)

   return noOfFiles;
}

答案 3 :(得分:0)

假设您的计数值为10并存储在内存位置100.当您执行类似

的操作时
  *count++

您现在指向内存位置101.您要做的是更改内存位置100的值而不是内存位置101.因此,您首先取消引用它然后增加存储在那里的内容。

  (*count)++;

当你这样做时

  *count = *count + 1;

您正在取消引用然后递增该值,然后将其存储回内存位置100。