为什么 ++ 不能正确递增?
Why does ++ not increment correctly?
我写了一个简单的函数来计算目录中非隐藏文件的数量。但是我注意到,当我使用 ++
来增加计数值时,我得到了奇怪的结果,比如负数和非常大的数字。当我将行 *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;
}
我相信,根据 operator precedence,
*count++;
应该写成
(*count)++;
否则,您的行为与您的预期完全相反(或者,就此而言,无效) .
*count++
扩展为 *(count++)
,而不是您预期的 (*count)++
。您递增的是地址,而不是文件数。
您递增的是指针而不是变量。您需要尊重指针(计数)。
更好更简洁的解决方案是简单地 return 文件数量而不是传递参数。
这消除了对指针保存计数的任何需要,并使方法签名更易于使用。
int count_files_directory(char *dir_path)
{
int noOfFiles = 0;
// Count files (omitted here)
return noOfFiles;
}
假设您的计数值为 10 并存储在内存位置 100。当您执行类似
的操作时
*count++
您现在指向内存位置 101。您想要做的是更改内存位置 100 的值,而不是转到内存位置 101。因此您将首先取消引用它,然后递增存储在那里的任何内容。
(*count)++;
当你
*count = *count + 1;
您正在取消引用然后递增该值,然后将其存储回内存位置 100。
我写了一个简单的函数来计算目录中非隐藏文件的数量。但是我注意到,当我使用 ++
来增加计数值时,我得到了奇怪的结果,比如负数和非常大的数字。当我将行 *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;
}
我相信,根据 operator precedence,
*count++;
应该写成
(*count)++;
否则,您的行为与您的预期完全相反(或者,就此而言,无效) .
*count++
扩展为 *(count++)
,而不是您预期的 (*count)++
。您递增的是地址,而不是文件数。
您递增的是指针而不是变量。您需要尊重指针(计数)。 更好更简洁的解决方案是简单地 return 文件数量而不是传递参数。 这消除了对指针保存计数的任何需要,并使方法签名更易于使用。
int count_files_directory(char *dir_path)
{
int noOfFiles = 0;
// Count files (omitted here)
return noOfFiles;
}
假设您的计数值为 10 并存储在内存位置 100。当您执行类似
的操作时 *count++
您现在指向内存位置 101。您想要做的是更改内存位置 100 的值,而不是转到内存位置 101。因此您将首先取消引用它,然后递增存储在那里的任何内容。
(*count)++;
当你
*count = *count + 1;
您正在取消引用然后递增该值,然后将其存储回内存位置 100。