c++自学笔记002-数据类型、变量、运算符、表达式和条件判断语句

本文是C++自学笔记,涵盖了数据类型、变量、运算符、表达式、If和switch语句。讨论了闰年的定义和判断规则,通过if和switch实现闰年的判断。并深入解析了400年规则,解释了为何如此定义闰年。
摘要由CSDN通过智能技术生成

数据类型

计算机中最小的存储单位是 位(bit),8位组成一个字节(byte),即1byte=8bit

c++中有各种数据类型,用以表示现实中的各种数据。如:
整型:int ,short int,long int
字符型:string
实型:double,float
不同数据类型可存储的数的范围也不同。

变量

程序执行过程中,其值可以发生改变的量。一个变量应该有一个变量名子,在内存中占据一定的存储单元。变量使用之前,应该先声明或定义。如:
int a=3;变量名是a,值为3,是int(整型)的,在内存中占据4个字节的存储空间。
笔记:根据定义不同,变量类型也不同,如实型变量,整型变量,字符型变量,不同类型变量只能存储对应数据类型的数据。

运算符

1)赋值运算符
= , +=,-=,*=,/=,%=等
注:%为取余运算符

2)关系运算符
<,>,<=,>=,运算结果为bool(布尔类型):0或1(假或真)
cout << boolalpha << a<b <<endl;

3)逻辑运算符
&& 与,|| 或,! 非。

4)位运算符

& 按位与,| 按位或,~按位非,^ 按位异或,<< 左移,>> 右移。
例:

cout << (4 & 5) << endl;

100 &101 运算结果为:100(4十进制),即每个对应位取与运算。

cout << (2 << 10) << endl;

位移运算此处重载,2<<10,表示把2的二进制“10”左移10位,即“100000000000”, 结果为22^10,为21024=2048。

5)sizeof运算符
基本用法:sizeof(type name)
如测量计算机中某种数据类型的长度:

cout << sizeof(int) << "\t" << sizeof(0.1) << endl;

运行结果为4 8(不同编译器或机型可能不同)

6)自增自减运算符

++ --,如i++,i–,++i,–i。


表达式

运算符和变量构成表达式,故而表达式按照参与的运算符不同,又可分为算术,逻辑,关系表达式等。
表达式构成语句,每个语句之间用“;”隔开。“{}”之间的语句,无论有多少个“;”均视为一个语句。


If语句

分为if,if else,if else if……
笔记:if可以用于判断某一个条件是否成立,成立则执行if后面的语句。
if else可用于判断那些只有两种情况的问题,无论那种情况均有对应语句执行。
if else可用于依次判断条件是否成立,每个if之后均有一个语句,只要任意一个语句被执行,之后的else if都不再进行判断。
基本用法示例:

int a,b,c,d;
    cout << "请输入三个数:" << endl;
    cin >> a >> b >> c;
    cout << a << "\t" << b << "\t" << c << endl;
    if(a>b)
    {
        d=a;
        a=b;
        b=d;
    }
    if(a>c)
    {
        d=a;
        a=c;
        c=d;
    }
    if(b>c)
    {
        d=b;
        b=c;
        c=d;
    }
    cout << a << "\t" << b << "\t" << c << endl;
 
   
    //强调下if的大括号,当需要执行的语句只有一条时,可省略:
  
    int a = 5, b = 10;
    if(a>b)
    if(a++ > --b)
    a+=b;
    cout << a << "\t" << b << endl;
    return 0;

三个语句可以合理灵活搭配使用。

    double a,b,c,d,max;
    cout << "输入4个数:" << endl;
    cin >> a >> b >> c >> d;
    a>b?max=a:max=b>c?b:c>d?c:d;//取出4个数中最大的数
    cout << max <<endl;

    /*
    float score;
    cout << "请输入分数:" << endl;
    cin >> score;
    if (score >=90) cout << "A等" << endl;
    else if(score >=80 && score <90) cout << "B等" << endl;
    else if (score >=70 && score <80) cout << "C等" << endl;
    else if (score >=60 && score <70) cout << "D等" << endl;
    else cout << "E等" << endl;
    return 0;

if关键字后均为表达式,该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。如a=5和a==5均是允许的。由于编译不会报错,为避免逻辑上的错误难以发现,可以采用以下方式:

    int a=2;
    if(3==a) cout << "a=3" << endl;
    else cout << "a=2" << endl;
    return 0;

if语句的嵌套

当if语句中的执行语句又是if语句时,则构成例if语句的嵌套。再嵌套内的if语句可能又是if else型的,这将出现多个if和else重叠的情况,这是要特别注意if和else的配对问题。为避免二义性,规定,else总是与它前面最近的if配对。

条件运算符和条件表达式
条件运算符为“?”和“:”,是三目运算符,即参与运算的量是三个。由条件运算符组成的条件表达式一般形式为:

表达式1?表达式2:表达式3

求值规则为:如果表达式1为真,则把表达式2的值作为整个表达式的值,否则把表达式3 的值作为整个表达式的值。该运算表达式自右至左运算。如:a>b?a:b>c?b:c应理解为a>b?a:(b>c?b:c)

    //输入一个字母,如果是大写字母则打印出来,如果不是,则转换成大写字母打印出来。
    char letter;
    cout << "输入一个字母:" << endl;
    cin >> letter;
    'A'<= letter && 'Z' >= letter?letter:letter-=32;
    cout << letter << endl;

switch语句

switch语句一般形式为:
switch (表达式1)
{
case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
……
case 常量表达式n:语句n;break;
default:语句n+1;
}
该语句含义为:计算表达式1的值,并按顺序逐个与其后的常量表达式的值型比较,当表达式1的值与某个常量表达式的值相同时,执行其后的语句,然后不再进行判断,继续执行后面的所有case后的语句。如表达式1的值与后面所有常量表达式值均不相同,则执行default后的语句。执行语句时,遇到break,则不再执行之后的语句,跳出整个switch语句。break可以省略,具体视程序想要实现的效果而定。

  int a;
    cout << "今天星期几?(数字):" << endl;
    cin >> a;
    switch (a)
    {
        case 1 : cout << "Monday" <<endl;//break;
        case 2 : cout << "Tuesday"<<endl ;//break;
        case 3 : cout << "Wednesday"<<endl;//break;
        case 4 : cout << "Thursday"<<endl;//break;
        case 5 : cout << "Friday"<<endl;//break;
        case 6 : cout << "Saturday"<<endl;//break;
        case 7 : cout << "Sunday"<<endl;//break;
        default :cout << "error" << endl;
        return 0;

注意点:
switch后的表达只能是整型或字符型。
case后常量表达式的值不能相同,允许多条语句,不需要大括号。
如果不添加break语句,需要特别注意执行顺序。
case和default子句的先后顺序可以自行变动,default可以省略。


题外话:有趣的闰年

闰年的定义:能被4整除,不能被100整除,或者能被400整除。
解释:能被4整除,不能被100整除的是普通闰年。能被400整除的是大闰年。
有了判断语句,就能通过闰年的定义来判断某一年是否为闰年了。

用if语句实现:

    int year;
    cout << "请输入年份:" << endl;
    cin >> year;
    if (0 == year%100)
    {
        if(0 == year%400)
        {
            cout << "公元" <<year << "年是闰年" << endl;
        }
        else cout << "公元" <<year << "年不是闰年" << endl;
    }
    else if(0==year%4)
    {
        cout << "公元" << year << "年是闰年" << endl;
    }
    else cout << "公元" <<year << "年不是闰年" << endl;
    return 0; 

用switch语句实现:

    int a,b,c,d;
    cout << "请输入年份:" << endl;
    cin  >> a;
    b=a%4;
    c=a%100;
    d=a%400;
    switch( 0 == b && 0 != c || 0 == d)
    {
        case 1: cout << a << "年是闰年" << endl; break;
        case 0: cout << a << "年不闰年" << endl; break;
    }
    return 0;

那么问题来了,为什么闰年要这样定义呢?
经过本人搜索资料与思考,做出以下详细解释:
首先,我们都知道,一年的本意是地球绕太阳一圈,即公转运行的时间,地球公转一圈又一圈,一年又一年。
平年(普通年)是365天,但地球绕太阳一周实际时间是365天零5小时48分46秒。所以,如果没有闰年存在,一年多出5小时48分46秒也就是20926s没有统计在内。4年就是83704s,又因为一天的时间是:
24*3600s=86400s
也就是说4年差不多要多处将近1天的时间没有计算在内。

故而,我们可以规定


第四年第二月多一天,即闰年比平年多一天,为366天,

这样近似地弥补了时间的误差。
但是问题还是没有完全解决。毕竟误差存在,每4年按86400s去多加上一天,跟实际上多出来的83704s相比,又多出了2696s不存在的时间。每400年就多出了100个2696s,即269600s,这与3天即259200s差不多。那么,


每400年再减少三天吧!

于是,就有了以下规定:

以1~400年这个区间为例:
1.每4年闰一年,即加一天,100年就加了25天,400年加了100天,即100个闰年。为了方便计量,规定能被4整除的数是闰年。
2.又因为每400年要减去3天,故而,实际上每400年中有3个闰年是需要被舍去。那么舍去哪三个闰年呢?我们可以看到,第100年,第200年,第300年按照规则1计算,刚好是三个闰年。那么我们把这三个闰年舍去,就得到了最终结果了:能被4整除却不能被100整除的年份是普通闰年,以及能被400整除的年份是大润年。

事实上,这种闰年的方式,任然没有解决根本问题,因为还有269600-259200=10400s不存在的时间。即,每400年我们的日历比地球公转形成的春夏秋冬四季提前了10400s,也就是2.88888……个小时,4000年就推迟了一天多。如果现有条件不变的话,几百万万年,几千万年后,我们将在本该过秋天的季节过夏天,本该过冬天的季节过秋天,本该过春天的季节过冬天。。。意思就是,季节变化比日历上推迟了。。。不过我等凡人寿命区区几十载,可以说是丝毫不受影响。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值