返回语句中的值为-1

时间:2013-03-17 14:45:57

标签: c if-statement

我想知道当返回值为-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");

}

6 个答案:

答案 0 :(得分:2)

通过查看您的compare_dates函数,如果日期d1为1而不是日期d2,则会返回greater,如果日期d1为{{1},则会返回-1如果两个日期都是lesser,则会返回日期d2和0

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

same

答案 1 :(得分: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)是无稽之谈,因为它永远都是真的。

答案 2 :(得分:1)

在C中,0为假,其他一切都为真。

在您的代码中,您必须

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表示第一个参数大于第二个

答案 3 :(得分: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 */
}

答案 4 :(得分: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;
    }
}

答案 5 :(得分:0)

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

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

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