经过几天的移情别恋,最终还是在即将开学之际重新着眼于c++的学习。上次进行到了变量作用域的部分,这次接着学习。
C++变量作用域
作用域是变量作用的区域,一般来说有三种类型:在函数或一个代码块内部声明的变量为局部变量;在函数参数的定义中生命的变量为形式参数;在所有函数外部声明的变量为全局变量。
局部变量示例:
#include<iostream>
using namespace id;
int main()
{
//局部变量声明
int a, b;
int c;
//实际初始化
a = 10;
b = 20;
c = a + b;
cout << c;
return 0;
}
全局变量实例:
#include<iostream>
using namespace std;
//声明全局变量
int g;
int main()
{
//声明局部变量
int a, b;
//实际初始化
a = 10;
b = 20;
g = a + b;
cout << g;
return 0;
}
局部变量的初始化需要用户自己进行,而全局变量被定义时,系统会自动初始化
数据类型 | 初始化默认值 |
int | 0 |
char | '\0' |
float | 0 |
double | 0 |
pointer | NULL |
C ++常量
常量是固定值,子啊程序执行期间不会改变,因此也称为字面量。常量的值在定义后不能更改。
整数常量可以有后缀u和L,大小写无关。
浮点常量由整数部分、小数部分和指数部分组成。
布尔常量只有两个,是标准的关键字,true和false,分别为1和0 。
字符常量分宽字符常量和窄字符常量,分别存储在wchar_t和char类中。另外有一些转义字符。
字符串常量或常量是双括号“ ”中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符,可以使用\作为分隔符,将一个很长的字符串常量进行分行。
定义常量
有两种定义方式:一是#define预处理器;二十const关键字。
示例如下:
#include<iostream>
using namespace std;
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'
int main()
{
int area;
area = LENGTH * WIDTH;
cout << area;
cout << NEWLINE;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
const int LENGTH = 10;
const int WIDTH = 5;
const char NEWLINE = '\n';
int area;
area = LENGTH * WIDTH;
cout << area;
cout << NEWLINE;
return 0;
}
C++修饰符类型
允许在char、int和double数据类型前放置修饰符。修饰符用于改变基本类型的含义,更能满足各种情境的需求。有signed、unsigned、long、short。允许使用速记符号来生命无符号短整数和无符号长整数。
C++中的类型限定符
类型限定符提供了变量的额外信息。
限定符 | 含义 |
const | const类型的对象在程序执行期间不能被改变 |
volatile | volatile告诉编译器哎不需要优化相关变量,使得程序可以直接从内存中读取变量。(对于一般的变量编译器会进行优化,即将内存中的变量值存放在寄存器中加快读写效率) |
restrict | restrict修饰的指针式唯一一种访问它所指向的对象的方式。 |
C++存储类
存储类定义C++程序中变量/函数的范围(可见性)和生命周期。这些说明放置在他们所修饰的类型之前。如auto、register、static、extern、mutable、thread_local。
auto存储类用于两种情况:一是声明变量时根据初始化表达式自动推断该变量的类型;二是声明函数时函数返回值的占位符。
auto f=3.14; //double
auto s("hello"); //const char*
auto z = new auto(9); //int*
auto x1=5, x2= 5.0, x3='r'; //错误,必须是初始化为同一类型
register存储类用于定义存储在寄存器中而不是ARM中的全部变量。这意味着变量的最大尺寸等于寄存器的大小,且不能对它使用一元的'&'运算符(因为它没有内存位置)。寄存器只用于需要快速访问的变量,比如计时器。但是定义register并不意味着变量将被储存到寄存器中,它意味着变量可能被存储在寄存器中,这取决于硬件和实现的限制。
static存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用static修饰局部变量可以在函数调用之间保持局部变量的值。static修饰符也可用于全局变量,当static修饰全局变量时,会使变狼的作用域限制在声明它的文件内。
#include<iostream>
//函数声明
void fun(void);
static int count=10;//全局变量
int main()
{
while(count--)
{fun();
}
return 0;
}
//函数定义
void fun(void)
{
static int i=5; //局部静态变量
i++;
std::cout<<"变量i为"<<i;
std::cout<<",变量count为"<<count<<std::endl;
}
extern存储类用于提供一个变量的引用,全局变量对于所有的程序文件都是可见的。
mutable说明符仅适用于类的对象,允许对象的成员替代常量。
thread_local说明符声明的变量仅可在它在其上创建的线程上访问。变量在创建线程时创建,在销毁线程时销毁。每个线程都有其自己的变量副本。thread_local可以与static或extern合并。可以将thread_local仅用于数据声明和定义,thread_local不能用于函数声明或定义。
thread_local int x; //命名空间下的全局变量
class X
{
static thread_local std::string s; //类的static成员变量
};
static thread_local std::string X::s; // X::s 是需要定义的
void foo()
{
thread_local std::vector<int> v; //本地变量
}
C++运算符
算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、杂项运算符
+-*、%++--
== != < > <= >=
&& ! ||
~ & | ^ << >>
= += -= *= /= %= <<= >>= &= ^= |=
sizeof(返回变量的大小);Condition?X:Y(条件运算符);,(逗号运算符);.和->(箭头)(成员运算符用于类、结构和共用体成员);Cast(强制转换运算符);&(指针运算符);*(指针运算符)
C++中运算符的优先级
优先级从低到高的顺序为:逗号、赋值、条件、逻辑或则OR、逻辑与AND、位或OR、位异或XOR、位与AND、相等、关系、移位、加减、乘除、一元、后缀
今天将C++的基本知识都进行了熟悉。之后就直接开始学习数据结构方面的知识,争取早日入门。