3.1 简单变量

定义一个变量后,系统根据变量类型的不同在内存的不同区域分配一个空间,将值复制到内存中,然后用户通过变量名访问这个空间。

3.1.1 变量名

  • 变量名的命名规则:

    1. 只能使用字母、数字、下划线
    2. 第一个字符不能是数字
    3. 区分大小写
    4. 不能使用关键字
    5. 以两个下划线/下划线和大学字符开头的名称保留给实现使用,以一个下划线开头的名称保留给实现,用作全局标识符(c++程序的所有源文件可用)
    6. 部分环境对变量名长度有要求

3.1.2 & 3.1.3 整型以及其扩展

计算机的基本单位是bit(位),一个bit分为0/1两种状态,8bit能表示256种不同的状态。一个字节通常意义上由8bit组成。1KB=1024字节。

int、short、long、long long都表示整型,但是他们的位数不同,所以表示的数值的范围也就不同。不同的类型规定了不同的最小长度。具体如下:

不同位数的系统中,整型的长度不一样。主要区别在于long类型和指针类型。16位机器中,long占4字节,不支持longlong类型,指针为2个字节。32位机器中,long占4字节,longlong占8个字节,指针占4个字节。64位系统中,long占8个字节,longlong8个字节,指针8个字节。

  1. // lismits.cpp
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. int main()
  5. {
  6. int n_8_int = INT8_MAX;
  7. int n_16_int = INT16_MAX;
  8. int n_32_int = INT32_MAX;
  9. int n_64_int = INT64_MAX;
  10. int n_int = INT_MAX;
  11. short n_short = SHRT_MAX;
  12. cout << "int 在不同机器上的大小:" << endl;
  13. cout << "8位" << n_8_int << endl;
  14. cout << "16位" << n_16_int << endl;
  15. cout << "32位" << n_32_int << endl;
  16. cout << "64位" << n_64_int << endl;
  17. cout << "本机" << n_int << endl;
  18. return 0;
  19. }

其余类型在自己机器中的最大最小长度查看limits.h

上图中用到了大量的#define指令。define是一个预编译指令,它在预编译阶段使用类似于查找替换的方式,将代码中的所同名的变量替换为具体的值。这是C语言的遗留方法。#define在C++标准中不推荐使用,它的优缺点如下:

优点:

  • 方便修改,一次修改全部改变
  • 提高运行效率 在define中写一些简短的函数

    缺点:
  • 没有类型检查,这个是致命伤,C++中推荐使用Const
  • 括号边界问题,直接替换容易报错。如#define MUL(a,b) a*b,代码中的MUL(a+b,c)就会变成a+b*c,因为是直接替换。
  • 函数边界问题。上面的问题在函数中也会出现,应该使用inline内联函数来代替#define。内联函数以牺牲空间的方法,来继承#define的有点,它采用传参的方式使用函数,有类型检查来保证程序的安全。可以进行调试,可以访问类中成员。内联函数要求必须要小,程序自动判断是否能作为内联函数调用,如果不能就当作普通函数调用。 内联函数一般只有几行代码,且不能有递归。

初始化的方式:

* int a = 10;

* int a(10); 下面是C++专属

* int a = {10};

* int a{10}

* int a = {} //默认初始化为0

还可以先声明,再在使用的时候赋值。先声明不赋值的话系统会自动赋值,然而为了避免莫名奇妙的Bug和浪费空间,还是声明的时候赋值比较好。

3.1.4 无符号类型

可以将整型类型的大小范围看作是一个首尾相连的圈。对于short类型,范围是-32768~32767。如果a=32767,那么a+1 = -32768,此时,short类型溢出了。

将符号定义为unsigned short后,因为是无符号类型,范围变为0~6553。所以如果b = 0,则b-1 = 65535,同样溢出。 如何定义你的整型类型要看你的需求和程序执行过程中这个变量的影响范围。定义成无符号型在特定情况下既能省内存,又不会溢出。

3.1.5

3.1.6 各类进制

  1. //hexoct.cpp
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. void change_to_binary(int);
  5. int main()
  6. {
  7. int a = 42;
  8. int b = 0x42;
  9. int c = 042;
  10. cout << "十进制的 42:" << a << endl;
  11. cout << "十六进制的 0x42:" << b << endl;
  12. cout << "八进制的 042:" << c << endl;
  13. int d = 42;
  14. cout << "42转十六进制: " << hex << d << endl;
  15. cout << "42转8进制: " << oct << d << endl;
  16. char buff[20] = "1239271";
  17. char *stop;
  18. cout << "转化为八进制结果: " << strtol(buff, &stop, 8) << endl;
  19. cout << "转化为十六进制结果: " << strtol(buff, &stop, 16) << endl;
  20. int num = 99;
  21. char str[100];
  22. itoa(99, str, 8);
  23. cout << "99转化为八进制" << str << endl;
  24. itoa(99, str, 16);
  25. cout << "99转化为十六进制" << str << endl;
  26. change_to_binary(10);
  27. return 0;
  28. }
  29. void change_to_binary(int value)
  30. {
  31. for (int i = 32; i >= 0; i--)
  32. {
  33. if (value & (1 << i))
  34. cout << "1";
  35. else
  36. {
  37. cout << "0";
  38. }
  39. }
  40. cout << endl;
  41. }

十六进制和八进制可以直接用十进制输出,cout自动识别并转换。

反过来,十进制转换为十六进制或十进制使用控制符hexoct,通过控制符来告诉cout类按照什么方式输出。

  • 转换方法:

    1.使用库函数itoastrtol

    2.使用hexoct控制符

    3.使用位运算(二进制)

3.1.7 C++如何自动确定常量的类型

除非有其他特殊的理由,如值太大、类型通过后缀指定了等,否则一律默认存储为int类型。

  • 后缀:

    • U/u表示unsigned类型
    • L/l表示long类型
    • ul表示unsigned long类型
    • LL/ll表示long long 类型
    • (其他还有多种组合。。。。。。以此类推)
  • 值的大小:
    • 每个类型都有固定的范围,超过范围就存为更大范围的类型

3.1.8 char类型

  • char类型也是一种整型,然而他存的是数字和字母。根据ASCII表,char存字母时,实际上存的是字母对应的数字编码。(除了ASCII表,还有其他对应的编码标准)
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. char ch = 'M';
  6. int i = ch;
  7. cout << ch << "的ASCII编码是" << i << endl;
  8. ch = ch + 1;
  9. i = ch;
  10. cout << "+1之后的编码是" << i << ",字母是" << ch << endl;
  11. cout << "使用cout.put()函数:" << endl;
  12. cout.put(ch);
  13. cout.put('!');
  14. return 0;
  15. // 变量ch的值为M,存入的是其数字编码77,`ch+1`就是77+1,输出的就是78对应的字母N。
  16. }
  • 转义字符:有一些字符无法通过键盘输入到cout中,如回车、制表等,还有些会被识别为代码,如“”等,此时就需要用转义字符。

  • char类型可以是无符号,也可以是有符号

    • char ch 这个可以是有符号也可以是无符号
    • unsigned char ch 无符号
    • signed char ch 有符号
  • wcha_t: 宽体char wcha_t bob = L'p'

  • char16_t / char32_t 长为16/32位的字符类型

3.1.9 bool类型

显示赋值: true / false、

隐式赋值: 非0值为true,0为false

Chapter03 第一节 简单变量的更多相关文章

  1. c语言第一章第一节 认识变量

    声明:本人大一新生,闲着无聊..写写c语言教程..菜鸟一枚..大神勿喷!!! 接下来我们都用dev来进行编译..vc++太古老了,没提示功能,不好上手,并且老是出毛病..vs太大了,编个c不至于,运行 ...

  2. python第一节:变量及数据类型

    一.变量 1.什么是变量 变:即为变化的事物 量:即为事物当前的状态 2.为什么用变量 变量可以方便的记录事物当前状态,在后面随时可以调出使用 3.怎么用变量 变量使用前需要先进行赋值(记录状态) 赋 ...

  3. 第一节 简单的jsp实例

    1.打开Eclipse,依次点击“File” .“New” .“Other” ,选择生成动态Web项目. 2.输入项目名字,点击Finish 生成项目结构如下: 3.在WebContent目录上,单击 ...

  4. 第四章 跨平台图像显示库——SDL 第一节 与SDL第一次亲密接触

    http://blog.csdn.net/visioncat/article/details/1596576 GCC for Win32 开发环境介绍(5) 第四章 跨平台图像显示库——SDL 第一节 ...

  5. 第一节,初识OpenCV3-图像的读、写、显、格式转化等

    之前一直在看深度学习,突然用到了对图像处理的东西,所以过来补充一下OpenCV基础. 就顺便从网上了买了一本OpenCV 3计算机视觉这本书,这本书比较薄,但是目前已经够我用了,在这里就记录一下我的学 ...

  6. 第一节,TensorFlow基本用法

    一 TensorFlow安装 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tsnsor(张量)意味着N维数组,Flow(流)意味着基 ...

  7. 基本教程篇--第一节:InitialSampleDemo.cs介绍

       第一节:InitialSampleDemo.cs介绍         为了讲解方便,我先附上源代码和效果图. 代码如下: using System; using System.Drawing; ...

  8. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  9. 程序演示:C语言第一个简单实例

    在信息化.智能化的世界里,可能很早很早 我们就听过许多IT类的名词,C语言也在其中,我们侃侃而谈,到底C程序是什么样子?让我们先看简单的一个例子: 1 2 3 4 5 6 7 8 9 #include ...

随机推荐

  1. [SCOI2016]幸运数字(线性基,倍增)

    [SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...

  2. __name__='main' 这句代码是什么意思?《读书笔记》

    当我们阅读 别人的python代码都会有 if name == "main"这么一行语句,但却不知道为什么要写这个?有什么用 想知道这段代码什么意思让我们来根据例子来测试一下 我们 ...

  3. Python-一些总结

    背景 主要是用来记录我在学习python过程中学习到他人的一些建议和自己的经验,有些内容可能并不妥,如果有请及时通知我纠正,谢谢.qq:472668561 我使用的python版本是3.7.4. 内容 ...

  4. DevExpress Winforms Controls:安装使用系统要求文档

    [DevExpress WinForms v19.1下载] 本文档包含了有关安装和使用DevExpress WinForms控件的系统要求信息. .NET Framework 下图展示了支持的.NET ...

  5. ZROI 19.07.31 AB班ACM

    写在前面:非常感谢cjc和djh两位神仙带我,非常感谢他们给了我一次躺赢的机会. 虽然我被硬点成了代码手,但我写的基本每次都有一堆罚时.然而djh爷全部1A,tql. 题目按照一血时间升序,大致符合难 ...

  6. 阅读之SQL优化

    一.性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句, ...

  7. 浅谈Mybatis通用Mapper使用方法_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 对单表进行增删改查是项目中不可避免的需求,Mybatis的通用Mapper插件使这些操作变得简单 添加maven依赖 在 ...

  8. eclipse中没有server选项无法配置Tomcat

    eclipse集成Tomcat: 打开eclipse - 窗口 - 首选项 - 服务器 - 运行时环境 找到Tomcat然后添加. eclipse添加插件: 开发WEB项目时要集成Tomcat可以并不 ...

  9. ssh复制公钥成功后仍需输入密码

    1,网上说权限问题 登录流程: 被登录机器的文件权限: //用户权限 chmod 700 /home/username //.ssh文件夹权限 chmod 700 ~/.ssh/ // ~/.ssh/ ...

  10. BZOJ 3193: [JLOI2013]地形生成 计数 + 组合 + 动态规划

    第一问: 先不考虑山的高度有相同的:直接按照高度降序排序,试着将每一座山插入到前面山的缝隙中. 当然,这并不代表这些山的相对位置是固定的,因为后面高度更低的山是有机会插入进来的,所以就可以做到将所有情 ...