寻乐·
多体会一下 学习一下数组的使用方法
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
bool isLeapYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
// 计算天数的方法 1
int calcMonthsDay(int m) {
assert(m > 0 && m < 13);
int days = 0;
// 利用 switch 不跳出的特性进行计算,不推荐使用,但是要明白原理
switch (m) {
case 12: days += 30;
case 11: days += 31;
case 10: days += 30;
case 9: days += 31;
case 8: days += 31;
case 7: days += 30;
case 6: days += 31;
case 5: days += 30;
case 4: days += 31;
case 3: days += 28;
case 2: days += 31;
default: break;
}
return days;
}
// // 计算天数的方法 2
// int calcMonthsDay(int m) {
// assert(m > 0 && m < 13);
// int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };
// int totalDays = 0;
// for (int i = 0; i < m - 1; ++i) {
// totalDays += days[i];
// }
// return totalDays;
// }
// 计算天数的方法 3
// int calcMonthsDay(int m) {
// assert(m > 0 && m < 13);
// int days[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
// return days[m - 1];
// }
int main() {
int year, month, day;
printf("请输入您要查询的年月日 >:");
scanf("%d %d %d", &year, &month, &day);
assert(month > 0 && month < 13);
assert(day > 0 && day < 32);
int totalDays = calcMonthsDay(month) + day;
if (isLeapYear(year) && month > 2) {
++totalDays;
}
printf("%d 年 %d 月 %d 日是该年中的第 %d 天\n", year, month, day, totalDays);
return 0;
}
寻乐·
写完上面的回复后,我意识到一些问题。
为什么 Python 和 Go 可以省略这些括号?
Python 的原因很简单,for
、if
和 while
的起始语句都以 :
结尾,所以能够区分起始语句和它们的语句块。
Go 我并不熟悉,查了一下语言规范,在 Go 中,大括号是强制使用的:
if <simple-stmt> expression {
...
}
所以 if
后的起始语句和语句块也能够区分开来。
C 和类 C 语言就不同了,它们的起始语句必须有括号,但语句块可以没有大括号。在 C++ 中,对于以下语句:
for (;;i++) 1;
去掉括号就难以分辨语法成分了。
所以实际上这是一个二选一的问题,总要有一个界定符存在的。
寻乐·
Python 和这几种语言在语法上的差距比较大。
Python 的初衷是作为一个动态的脚本语言,语句末尾不用分号属于比较常见的情况。对于括号,Python 的语法成分不要求这个东西。
if <condition>:
...
带上括号也能成立的原因是 (True)
这个括号表达式的值是 True
本身,所以不影响程序的运行。
C++ 的 for
语句格式是这样的:
for (<init-statement> <condition>; <expression>)
<statement>
可以看出括号是必要的语法成分。
这里
<init-statement>
后面没有分号的原因是,;
是<init-statement>
的一部分。
这与语言设计者的理念有关,Python 的设计者认为这几种语句后面使用空格就能够区分各个语法成分,去掉多余的括号会更加简洁。
而 C++、Java、C# 等语言的语法受 C 语言的影响比较深,从 C 继承了一部分语法,就成了现在这个样子,它们也被称为类 C 语言。
有趣的是,C 的发明者设计新的语言 golang 时,也去掉了不少的括号。