首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这个c代码的结果是"days: 33“而不是"days: 30"?

这个问题涉及到C语言中日期计算的基础概念。首先,我们需要了解C语言中处理日期和时间的相关函数,如time.h头文件中的tm结构体和mktime函数等。

假设我们有以下C代码:

代码语言:txt
复制
#include <stdio.h>
#include <time.h>

int main() {
    struct tm startDate = {0};
    struct tm endDate = {0};
    time_t startTime, endTime;
    int days;

    startDate.tm_year = 2021 - 1900; // 年 - 1900
    startDate.tm_mon = 0; // 月 [0-11]
    startDate.tm_mday = 1; // 日 [1-31]

    endDate.tm_year = 2021 - 1900;
    endDate.tm_mon = 1; // 二月
    endDate.tm_mday = 3; // 3号

    startTime = mktime(&startDate);
    endTime = mktime(&endDate);

    days = (endTime - startTime) / (60 * 60 * 24);

    printf("days: %d\n", days);

    return 0;
}

这段代码的目的是计算2021年1月1日到2021年2月3日之间的天数。结果输出为"days: 33"而不是"days: 30"。原因如下:

  1. 闰年和平年的区别:2021年是平年,但我们需要考虑闰年的情况。闰年2月有29天,平年2月有28天。这里2021年是平年,所以2月有28天。
  2. mktime函数的处理mktime函数会自动调整日期,使其符合实际的日历规则。例如,如果设置的日期不合法(如2月30日),mktime会自动调整到下一个合法日期。
  3. 时间差计算(endTime - startTime) / (60 * 60 * 24)计算的是两个时间点之间的秒数差,然后转换为天数。

具体到这段代码,startDate设置为2021年1月1日,endDate设置为2021年2月3日。mktime函数会将这两个日期转换为对应的time_t值,然后计算它们之间的差值。

由于mktime函数会自动调整日期,实际计算的天数包括了1月的31天和2月的2天(从2月1日到2月3日),总共33天。

解决方法

如果你希望计算两个日期之间的天数,可以使用更精确的方法,例如手动计算每个月的天数:

代码语言:txt
复制
#include <stdio.h>

int daysInMonth(int year, int month) {
    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (month == 1 && (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))) {
        return 29; // 闰年2月
    }
    return days[month];
}

int main() {
    int startYear = 2021;
    int startMonth = 1;
    int startDay = 1;
    int endYear = 2021;
    int endMonth = 2;
    int endDay = 3;

    int days = 0;

    while (startYear < endYear || (startYear == endYear && startMonth < endMonth)) {
        days += daysInMonth(startYear, startMonth);
        startMonth++;
        if (startMonth > 12) {
            startMonth = 1;
            startYear++;
        }
    }

    days += endDay - startDay;

    printf("days: %d\n", days);

    return 0;
}

这段代码手动计算每个月的天数,并考虑闰年的情况,最终得到正确的天数。

参考链接

希望这些信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深度讲解TS:这样学TS,迟早进大厂【16】:枚举

未来属于努力奋斗我们! 有什么关于前端疑问,可以问博主就好啦,知无不言哦~ 关注公众号:敲代码小江,获取大厂面试题与视频讲解,了解职业发展前景。...编译结果是: var Days; (function (Days) { Days[Days["Sun"] = 3] = "Sun"; Days[Days["Mon"] = 1] = "...手动赋值枚举项可以不是数字,此时需要使用类型断言来让 tsc 无视类型检查 (编译出 js 仍然是可用): enum Days {Sun = 7, Mon, Tue, Wed, Thu, Fri,...当一个表达式满足下面条件之一时,它就是一个常数枚举表达式: 数字字面量 引用之前定义常数枚举成员(可以是在不同枚举类型中定义)如果这个成员是在同一个枚举类型中定义,可以使用非限定名来引用...C#。

37220
  • C语言学习-函数(上)

    目录 库函数: 自定义函数: Return用法: 数组做函数参数: 嵌套调用和链式访问: 库函数: cplusplus.com:C library - C++ Reference 库函数相关头⽂件:C...和break不同,break只能用于跳出循环,但是后面的操作还能继续,return语句执⾏后,函数就彻底返回,后边代码不再执⾏。...,如果要函数实现,可以设计2个函数: • is_leap_year():根据年份确定是否是闰年 • get_days_of_month():调⽤is_leap_year确定是否是闰年后,再根据⽉计算这个...,如果要函数实现,可以设计2个函数: //is_leap_year():根据年份确定是否是闰年 //get_days_of_month():调⽤is_leap_year确定是否是闰年后,再根据⽉计算这个...✨ 看⼀个有趣代码,下⾯代码执⾏结果是什么呢?

    11610

    C语言】函数系统化精讲(一)

    这个代码结果不是三,而是未定义行为。原因是在add函数中,如果c值不等于8,没有明确返回值,即没有return语句。这将导致在main函数中使用add函数返回值时,得到是未定义值。...但是这种情况并不是所有编译器和操作系统都会出现,所以这个程序行为是未定义。因此,不应该依赖这种行为,而应该在add函数中加上明确返回语句。...[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int day = days[m]; if (is_leap_year(y)...代码中反应了不少函数调⽤: • main 函数调⽤ scanf 、 printf get_days_of_month • get_days_of_month 函数调⽤ is_leap_year 3.2...在看⼀个有趣代码,下⾯代码执⾏结果是什么呢?

    10710

    位运算操作

    假设第5位上不是1,而是0, 那么最后结果一定全部都是0 所以可以认定:最后结果如果不是0,那么这一位是肯定是1,如果是0,那么这一位上就一定是 0 根据这个思路,代码如下: public boolean...但是下面的移位63,输出结果并不是预期结果,预期结果应该是第 63位(最左边最高为)为1,其余全部是0才对,为什么中间多了好多1? 原来Java中左移运算符<< 在运算时候是有要求。...JVM会检查数据类型,也就是检查 1 ,发现是int类型,int是4个字节32位,那么它会做 63%32 运算,结果是31,这个31才是真正要左移位数 上面的代码 1<<63, 其实真正左移了31位...因为序列长度不超过64,序列中每个值都不超过64,long类型刚好是64位,所以就可以将要排序序列"映射"到二进制序列上。...类型在参与运算时候会提升为int类型,int类型是 32 位,所以移位时候会做 56%32 操作,真正移动是24位,不是56位,这样最终结果就会出现错误。

    1.2K21

    C语言(函数)

    一、函数 1、函数概念 C语言中函数,准确来说应该叫子程序,与数学中函数不同,C语言中函数就是一个完成某项特定任务一小段代码。...这段代码是有特殊写法和调用方法C语言程序其实是由无数个小函数组合而成,也就是说,一个大计算任务可以分解成若干个小函数(对应小任务)完成。...同时一个函数如果能完成某项特定任务的话,这个函数是可以复用,提升了开发软件效率。 在C语言中函数一般分为两类:库函数和自定义函数。...这里我们先补充一个点,我们最熟悉 printf()函数其实是有返回值,其返回值为打印字符个数。知道了这个我们再来猜一下上面代码执行结果是什么? 想必聪明各位已经计算出了结果。...再看上面的代码,执行结果是 43 3 2,其说明了空格也是一个字符。

    10310

    广告行业中那些趣事系列51:超牛kaggle比赛Favorita Grocery Sales Forecasting冠军方案

    导读:本文是“数据拾光者”专栏第五十一篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。...17个分组;红色三个字段是商品特征,其中family是商品分类,总共有33个分类,class代表商品小类,有337个小类别,perishable代表商品是否容易变质;oil_price代表油价,day_type...这里需要介绍下为什么可以使用之后促销天数数据,因为在测试集中官方已经给出了未来一段时间某商店某商品是否会进行促销,所以我们可以用未来几天促销数据; 时间窗口内(最近3/7/14/30/60/140天...这个特征和上一个特征是一样,只不过计算是上一周各个特征值,作者想查看前一周销量各个特征; 时间窗口内(最近7/14/30/60/140天): 有销量/促销天数,分别查看时间窗口内有销量和促销天数...,这也是kaggle比赛提分套路了,最终提交结果是: finalmodel=0.42*model1 + 0.28 * model2 +0.18 * model3 + 0.12 * model4 03

    49420

    嵌套调用和链式反应

    1.2链式反应 在C语言中,链式反应通常指的是链表(linked list)数据结构使用。...链表是一种动态数据结构,它由一系列节点(node)组成,每个节点包含一个数据元素和一个指向下一个节点指针。 在链表中,每个节点都有一个指向下一个节点指针,这个指针可以用来连接各个节点。...get_days_of_month():用于判断某一个月份天数, 2.某年某月天数代码 #include int Leap_year(int y) { if (y % 4 ==...} 大家首先来看一下这个代码,你感觉他会输出什么?...现在我们来看一下会输出什么结果: 结果是,他会输出4321。 这是因为第一个printf会打印43,但是第二个不会,他会打印43这个大小,所以接下来输出2,然后打印2大小,再输出1.

    6110

    C语言----函数

    1.函数概念 函数:founction c语言程序代码都是函数组成 c语言中函数就是一个完成某项特定任务一段代码,这段代码有特殊写法和调用方法 c语言中我们一般见到两种函数: .库函数 ....;实际参数,简称实参, 在这个代码里面,我们把第15行a和b叫做实参 在函数定义部分,函数名后面的参数叫;形式参数,就是本代码里面的x和y 形参其实是实参临时拷贝 5.return语句 return...(int y ,int m)//接受年和月//这里我们需要返回一个整型 { int days[] = {0, 31,28,31,30,31,30,31,31,30,31,30,31 };..." 写出这行代码,头文件就能正常使用了 这样就把函数声明和定义拆散了,函数定义放在.c文件 函数声明放在头文件 我们要把add.h和add.c当做一个模块,只要想使用这个模块,包含头文件即可 把大型复杂程序...修饰变量,在第二轮循环时候,使用变量就是上一次留下来不是新建变量 //如何使用static去修饰变量 //:未来一个变量出了函数,我们还想保留值,等下次进入函数继续使用,就可以使用static

    6110

    Python时间获取及转换

    如 星期三为Web %A: 星期全写。如 星期三为Wednesday %b: 月份简写。如4月份为Apr %B: 月份全写。如4月份为April %c: 日期时间字符串表示。...(如: 04/07/10 10:43:39) %d: 日在这个月中天数(是这个第几天) %f: 微秒(范围[0,999999]) %H: 小时(24小时制,[0, 23]) %I:...%S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~) %U: 周在当年周数当年第几周),星期天作为周第一天 %w: 今天在这周天数,范围为[0,...In [33]: datetime.date.today() Out[33]: datetime.date(2017, 4, 26) 获取明天/前N天 获取明天日期: In [34]: import...datetime In [36]: datetime.date.today()+datetime.timedelta(days=1) Out[36]: datetime.date(2017, 4, 27

    1.2K60

    shell 数组

    数组名[@]} 3.while循环:根据元素个数遍历,但对于稀疏数组,可能会丢失数据 days=(one two three 4) for day in ${days[*]} #或${days[@]...days[@]} do # 此刻 i 为下标,通过下标取数组值 echo ${days[$i]} #这里没有 !...$test2 执行一下 sh test.sh 11 22 33 44 结果: 11 22 33 44 22 33 44 函数间数组传递 这个就比较绕了,绕在哪呢,就在传递没问题,接收的话,...[@]} #如果直接使用 $arr 作为位置变量,则只会将数组第一个元素传递过去 } main 结果: 原始数组值为: 10 20 30 40 50 test1 result: 函数接收到参数列表为...: 10 20 30 40 50 新数组值为: 10 20 30 40 50 10 20 30 40 50 test2 result: 10 20 总结 shell 数组,函数间数组传递需要注意其它大同小异

    23730

    LeetCode Weekly Contest 30解题思路

    https://blog.csdn.net/u014688145/article/details/71023781 LeetCode Weekly Contest 30解题思路 详细代码可以...我们来看看21这个痕迹点,21-7表示去搜寻14位置处是否有痕迹,此时我们发现有两处痕迹能最终达到21,所以此处要让计数器+2。所以说,这个问题我们用O(n)O(n)就能解决了!...,下者思路要清楚很多,首先 int[][] dp = new int[k+1][n] // k + 1 表示week, n表示city 为啥k+1是k+1不是k,n是n不是n+1。...另外一个原因在于k+1,则预留了一个初始态,那么更新就可以从初始态0开始,而非第一周开始,这也是为什么代码当中出现了多个循环原因,我虽然同样用了dp[k+1][n+1],但是依旧用第一周当初始态(...这就意味着当有city == lastCity条件时,减少了一次判断,即时加上当天假期数,该值还是很小值。而这避免了0值尴尬,这也就是为什么代码当中出现了0判断。

    41530

    如何对你 Linux 系统进行压力测试

    为什么你会想给你 Linux 系统施加压力呢?因为有时你可能想知道当一个系统由于大量运行进程、繁重网络流量、过多内存使用等原因而承受很大压力时,它表现如何。...幸运是,对于那些需要能够预测 Linux 系统在压力下反应的人来说,你可以采用一些有用技术和工具来使这个过程更容易。在这篇文章中,我们将研究其中一些。...11:28:34 up 5 days, 17:30, 2 users, load average: 3.67, 1.63, 0.66 11:29:04 up 5 days, 17:30, 2 users...2.13, 1.01 11:31:34 up 5 days, 17:33, 2 users, load average: 1.40, 1.94, 0.98 因为所显示负载分别代表了 1、...在接下来这个例子中,运行这个增加内存压力命令,然后启动 watch-it-2 脚本。

    1.4K30
    领券