0

我想知道当返回值为-1时它如何打印该行。另外,我不知道 -1 是做什么的,比如 1 代表真,0 代表假,但 -1 是什么。

#include <stdio.h>

struct date {
    int day, month, year;
};

int compare_dates(struct date d1, struct date d2) {
    if(d1.year < d2.year)
        return -1;
    else if(d1.year > d2.year)
        return 1;
    else if(d1.month < d2.month) 
            return -1;
    else if(d1.month > d2.month) 
            return 1;
    else if(d1.day < d2.day) 
            return -1;
    else if(d1.day > d2.day)
            return 1;
    else
        return 0;


}

int main(void) {
    struct date d1, d2;
    printf("Enter first date (dd/mm/yyyy): ");
    scanf("%2d/%2d/%4d", &d1.day, &d1.month, &d1.year);
    printf("Enter second date (dd/mm/yyyy): ");
    scanf("%2d/%2d/%4d", &d2.day, &d2.month, &d2.year);

    if(compare_dates(d1, d2)) 
        printf("Date1 comes after than Date2");
    else if(!compare_dates(d1, d2))
        printf("Date1 and Date2 are equal");
    else if(-1)
        printf("Date1 comes before than Date2");

}
4

6 回答 6

2

通过查看您的 compare_dates 函数,1如果日期 d1greater比日期 d2-1将返回,如果日期 d1lesser将比日期 d20将返回,如果两个日期都将返回same

因此,您的代码应如下所示:

   int main(void) 
   {
        struct date d1, d2;
        int result;
        printf("Enter first date (dd/mm/yyyy): ");
        scanf("%2d/%2d/%4d", &d1.day, &d1.month, &d1.year);
        printf("Enter second date (dd/mm/yyyy): ");
        scanf("%2d/%2d/%4d", &d2.day, &d2.month, &d2.year);

        result = compare_dates(d1, d2);
        if(1 == result)
            printf("Date1 comes after than Date2");
        else if(0 == result)
            printf("Date1 and Date2 are equal");
        else if(-1 == result)
            printf("Date1 comes before than Date2");

   }
于 2013-03-17T14:49:31.260 回答
1

如果你有一个名为 的函数dates_are_equal,返回 0 或 1(或更一般地 0 或非 0),那么直接使用结果作为条件是有意义的:

if (dates_are_equal(d1, d2)) {
    printf("Date1 and Date2 are equal\n");
}
else {
    printf("Date1 and Date2 are not equal\n");
}

但是您的compare_dates函数可以返回具有三种不同含义的三个不同整数值中的任何一个。结果是一个数字,而不是一个条件,所以不要把它当作一个条件。相反,通过将结果与另一个整数进行比较来构建条件。

有几种方法可以做到这一点。与 类比strcmp(),它通过返回一个小于、等于或大于的值0(不一定只是-10-1)来表示比较结果,您可以这样写:

int comparison = compare_dates(d1, d2);
if (comparison < 0) {
    printf("Date1 comes before Date2\n");
}
else if(comparison == 0) {
    printf("Date1 and Date2 are equal\n");
}
else { // No need to test again here
    printf("Date1 comes after Date2\n");
}

如果您想假设compare_dates()只能返回-101,则可以使用 switch 语句:

switch (compare_dates(d1, d2)) {
    case -1:
        printf("Date1 comes before Date2\n");
        break;
    case 0:
        printf("Date1 and Date2 are equal\n");
        break;
    case 1:
        printf("Date1 comes after Date2\n");
        break;
    default:
        fprintf(stderr, "Internal error, unexpected result\n");
        exit(EXIT_FAILURE);
}

建议使用(!comparison)代替(comparison == 0). 这是完全合法的,它对编译器意味着完全相同的事情,但在我看来,最好将!运算符保留为真正逻辑布尔值的值。

将非布尔表达式视为条件是常见的做法,例如写作

if (!strcmp(s1, s2)) {
    /* the strings pointed to by s1 and s2 are equal */
}

或者

if (!ptr) {
    /* ptr is a null pointer */
}

但我发现更明确会使代码更易于阅读:

if (strcmp(s1, s2) == 0) {
    /* the strings pointed to by s1 and s2 are equal */
}

或者

if (ptr != NULL) {
    /* ptr is a null pointer */
}
于 2013-03-17T15:14:20.610 回答
1

这个:

if(compare_dates(d1, d2)) 
    printf("Date1 comes after than Date2");
else if(!compare_dates(d1, d2))
    printf("Date1 and Date2 are equal");
else if(-1)
    printf("Date1 comes before than Date2");

搞砸了。您应该调用 compare_dates 一次并将其结果与各种可能性进行比较。

尤其if(-1)是胡说八道,因为它永远都是真的。

于 2013-03-17T14:48:55.457 回答
1

在 C 中,0 为 False,其他一切为 True。

在您的代码中,您必须这样做

if(compare_dates(d1, d2) == 1) 
    printf("Date1 comes after than Date2");
else if(!compare_dates(d1, d2))
    printf("Date1 and Date2 are equal");
else if(compare_dates(d1, d2) == -1)
    printf("Date1 comes before than Date2");

或者,更高效

int value = compare_dates(d1, d2)
if(value == 1) 
    printf("Date1 comes after than Date2");
else if(!value)
    printf("Date1 and Date2 are equal");
else if(value == -1)
    printf("Date1 comes before than Date2");

对于比较函数,0 通常表示值相等,-1 表示第一个参数小于第二个,1 表示第一个参数大于第二个

于 2013-03-17T14:49:58.187 回答
0

在 C 中,一切!= 0都是真的。

if(-1) // = true
if(0)  // = false
if(1)  // = true
if(1234567) // = true

要根据返回值打印消息,请使用switch

switch(compare_dates(d1, d2)){
    case -1: {
        // do whatever should done when compare_dates returns -1
        break; //don't forget the break
    }
    case 0: {
        // do whatever should done when it returns 0
        break;
    }
    case 1: {
        // ...
        break;
    }
}
于 2013-03-17T14:51:06.650 回答
0

实际上,0 表示 d1 和 d2 相等。请允许我解释一下:

-1 表示 d1 小于 d2。因此,“小于”运算符<对应于 -1。0 表示 d1 等于 d2。因此与“等于”运算符==相对应。1 表示 d1 大于 d2。因此“大于”运算符>对应于 1。

这只是约定,可能受到strcmp使用相同约定的 C 标准函数的影响。

于 2013-03-17T14:52:33.357 回答