我想知道当返回值为-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");
}
答案 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
(不一定只是-1
,0
的值来指示比较结果,或-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()
只能返回-1
,0
或1
,您可以使用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
函数的影响。