C++变量学习点

1:对于输入的值超出类型的取值范围的处理办法

编译器会将该值对 unsigned 类型的可能取值数目求模,然后取所得值。比如 8 位的 unsigned char,其取值范围从 0 到 255(包括 255)。如果赋给超出这个范围的值,那么编译器将会取该值对 256 求模后的值。例如,如果试图将 336 存储到 8 位的 unsigned char 中,则实际赋值为 80,因为 80 是 336 对 256 求模后的值。

#include <iostream>

int main()
{
    unsigned char v; //0-255的取值范围

    v = 257;
    std::cout << "v=" << v << std::endl;

    return 0;
}

打印出来的是笑脸!!!!!!

2:字符串的连接

#include<iostream>
int main()
{

    std::cout << "\nCC\toptions\tfile.[cC]\n" "shit"<< std::endl;

    return 0;
}

3:左右值的定义

1.  左值(发音为 ell-value):左值可以出现在赋值语句的左边或右边。

2.  右值(发音为 are-value):右值只能出现在赋值的右边,不能出现在赋值语句的左边。

4:理解“初始化不是赋值”是必要的。初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。

5:复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中:

int a(10);
int a=10;直接初始化语法更灵活且效率更高。

对内置类型来说,复制初始化和直接初始化几乎没有差别。对类类型的对象来说,有些初始化仅能用直接初始化完成。要想理解其中缘由,需要初步了解类是如何控制初始化的。

6:定义和声明

C++ 区分了声明和定义,变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。

extern int i;   // declares but does not define i
int i;          //  declares and defines i 

声明用于向程序表明变量的类型和名字,定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用 extern 关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字 extern: extern 声明不是定义,也不分配存储空间。事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。

7:const的相关概念

const 对象局部于文件创建,非 const 变量默认为 extern。要使 const 变量能够在其他的文件中访问,必须指定它为 extern。

#include<iostream>
#include<string.h>

int main()
{
    extern const int a;    extern int b;
    std::cout << a <<std::endl;
    return 0;
} 

file-1
#include <iostream>

extern const int a = 3;int b = 4;

8:typedef 可以用来定义类型的同义词

typedef 定义以关键字 typedef 开始,后面是数据类型和标识符。标识符或类型名并没有引入新的类型,而只是现有数据类型的同义词。typedef 名字可出现在程序中类型名可出现的任何位置。

1  为了隐藏特定类型的实现,强调使用类型的目的。

2  简化复杂的类型定义,使其更易理解。

3  允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。

typedef double wages;       //  wages is a synonym for double
typedef int exam_score;     //  exam_score is a synonym for int
typedef wages salary;       //  indirect synonym for double 

9:定义和初始化枚举

枚举的定义包括关键字 enum,其后是一个可选的枚举类型名,和一个用花括号括起来、用逗号分开的枚举成员列表。

// input is 0, output is 1, and append is 2    enum open_modes {input, output, append}; 

默认地,第一个枚举成员赋值为 0,后面的每个枚举成员赋的值比前面的大 1。

 enum Forms {shape = 1, sphere, cylinder, polygon}; 

在 枚举类型 Forms 中,显式将 shape 赋值为 1。其他枚举成员隐式初始化:sphere 初始化为 2,cylinder 初始化为 3,polygon 初始化为 4。

  enum Points { point2d = 2, point2w,                    point3d = 3, point3w }; 

枚举成员 point2d 显式初始化为 2。下一个枚举成员 point2w 默认初始化,即它的值比前一枚举成员的值大 1。因此 point2w 初始化为 3。枚举成员 point3d 显式初始化为 3。一样,point3w 默认初始化,结果为 4。

不能改变枚举成员的值。枚举成员本身就是一个常量表达式,所以也可用于需要常量表达式的任何地方。

10:头文件的相关规定

extern int ival = 10;      // initializer, so it‘s a definition
double fica_rate;          // no extern, so it‘s a definition 

虽然 ival 声明为 extern,但是它有初始化式,代表这条语句是一个定义。类似地,fica_rate 的声明虽然没有初始化式,但也是一个定义,因为没有关键字 extern。同一个程序中有两个以上文件含有上述任一个定义都会导致多重定义链接错误。

对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知道的 const 对象和 inline 函数,在头文件中定义这些实体,是因为编译器需要它们的定义(不只是声明)来产生代码。例如:为了产生能定义或使用类的对象的代码,编译器需要知道组成该类型的数据成员。同样还需要知道能够在这些对象上执行的操作。类定义提供所需要的信息。在头文件中定义 const 对象则需要更多的解释。

11:C++头文件相关规定

计头文件时,应使其可以多次包含在同一源文件中,这一点很重要。我们必须保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义。使得头文件安全的通用做法,是使用预处理器定义头文件保护符。头文件保护符用于避免在已经见到头文件的情况下重新处理该头文件的内容。预处理器变量有两种状态:已定义或未定义。定义预处理器变量和检测其状态所用的预处理器指示不同。#define 指示接受一个名字并定义该名字为预处理器变量。#ifndef 指示检测指定的预处理器变量是否未定义。如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现 #endif。

#ifndef SALESITEM_H
#define SALESITEM_H
// Definition of Sales_item class and related functions goes here
#endif

测试 SALESITEM_H 预处理器变量是否未定义。如果 SALESITEM_H 未定义,那么 #ifndef 测试成功,跟在 #ifndef 后面的所有行都被执行,直到发现 #endif。相反,如果 SALESITEM_H 已定义,那么 #ifndef 指示测试为假,该指示和 #endif 指示间的代码都被忽略。

C++变量学习点,布布扣,bubuko.com

时间: 2024-08-25 05:19:30

C++变量学习点的相关文章

前端面试合集

VUE 1.什么是 vue 生命周期 2.vue生命周期的作用是什么 3.第一次页面加载会触发哪几个钩子 4.简述每个周期具体适合哪些场景 5.created和mounted的区别 6.vue获取数据在哪个周期函数 7.请详细说下你对vue生命周期的理解? vue路由面试题 mvvm 框架是什么?vue-router 是什么?它有哪些组件 active-class 是哪个组件的属性?怎么定义 vue-router 的动态路由? 怎么获取传过来的值vue-router 有哪几种导航钩子?6.$ro

Linux下修改环境变量PATH

1.什么是环境变量(PATH) 在Linux中,在执行命令时,系统会按照PATH的设置,去每个PATH定义的路径下搜索执行文件,先搜索到的文件先执行. 我们知道查阅文件属性的指令ls 完整文件名为:/bin/ls(这是绝对路径), 那你会不会觉得很奇怪:"为什么我可以在任何地方执行/bin/ls这个指令呢? " 为什么我在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变量 PATH 的帮助所致呀! 当我们在执行一个指令癿时候,举例

Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)

原文:http://www.cnblogs.com/heshan664754022/archive/2013/03/27/2984357.html Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量) 用文本编辑工具打开用于启动Tomcat的批处理文件startup.bat,仔细阅读.在这个文件中,首先判断CATALINA_HOME环境变量是否为空,如果为空,就将当前目录设为CATALINA_HOME的值.接着判断当前目录下是否存在bin\catalina.bat,如果文件

JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题

<h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3><h3>无需指定返回值,可以在任何时候返回任何值.未指定返回值的函数,返回的是一个特殊的undefined值</h3> <script type="text/javascript"> function sayHi(){ console.log("Hi"); }; sayHi(); function sayName(name,age){

Linux下修改.bash_profile 文件改变PATH变量的值

Linux中含有两个重要的文件 /etc/profile和$HOME/.bash_profile 每当系统登陆时都要读取这两个文件,用来初始化系统所用到的变量,其中/etc/profile是超级用户所用,$HOME/.bash_profile是每个用户自己独立的,我们可以修改该文件来设置一些变量. 命令用法如下 $ cd (进入用户登陆目录) $ls –al .bash_profile(.bash_profile为隐藏文件,因此要用ls –a命令查找) $vi .bash_profile(用vi

linux安装maven及配置环境变量 配图

Maven 3.5.0 maven安装和环境变量的配置 1 下载 maven 链接:http://pan.baidu.com/s/1qXXjXfe 密码:r92r 2 解压安装包 tar zvxf apache-maven-3.5.0-bin.tar.gz 3  配置maven环境变量 vi  /etc/profile   编辑系统配置文件 #set Maven environmentexport MAVEN_HOME=/usr/local/software/dir-maven/apache-m

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

[转]表变量和临时表的比较

本文转自;http://www.cnblogs.com/CareySon/archive/2012/06/11/TableVariableAndTempTable.html 关于表变量是什么(和表变量不是什么),以及和临时表的比较让很多人非常困惑.虽然网上已经有了很多关于它们的文章,但我并没有发现一篇比较全面的.在本篇文章中,我们将探索表变量和临时表是什么(以及不是什么),然后我们通过使用临时表和表变量对其解密. 表变量 表变量在SQL Server 2000中首次被引入,那么,什么是表变量呢?

Java的成员变量初始化

对于方法里面的成员变量,Java要求程序员强制提供一个初始化的值.比如下面这个方法就会出错: public class Breakyizhan{ public void Z(){ int z; z++; } public static void main(String[] args) { Breakyizhan B = new Breakyizhan(); B.Z(); } } /* (www.breakyizhan.com) 输出结果是: 编译会出错,方法变量没有初始化 */ 而对于类的数据,