编译C文件时出现以下错误:

t_memmove.c: In function ‘ft_memmove’:
ft_memmove.c:19: warning: comparison of unsigned expression >= 0 is always true

这是完整的代码,通过 cat ft_memmove.c :
#include "libft.h"
#include <string.h>

void    *ft_memmove(void *s1, const void *s2, size_t n)
{
    char    *s1c;
    char    *s2c;
    size_t  i;

    if (!s1 || !s2 || !n)
    {
        return s1;
    }
    i = 0;
    s1c = (char *) s1;
    s2c = (char *) s2;
    if (s1c > s2c)
    {
        while (n - i >= 0) // this triggers the error
        {
            s1c[n - i] = s2c[n - i];
            ++i;
        }
    }
    else
    {
        while (i < n)
        {
            s1c[i] = s2c[i];
            ++i;
        }
    }
    return s1;
}

我确实理解 size_t 是无符号的,因此两个整数都将 >= 0。但是因为我从另一个中减去一个,所以我不明白。为什么会出现这个错误?

最佳答案

如果在 C 中减去两个无符号整数,结果将被解释为无符号。它不会仅仅因为您减去它就自动将其视为有符号。解决这个问题的一种方法是使用 n >= i 而不是 n - i >= 0

关于c - 警告 : comparison of unsigned expression >= 0 is always true,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20074073/

10-11 17:52