Learning C++之 1.3 变量,初始化以及声明

C++程序创建对象,使用对象,操作对象,销毁对象。对象就是存储数据的一块内存。你可以把对象想象成一个存储和检索信息的小盒子。每台电脑都有自己的内存,称作RAM。当一个对象创建的时候,RAM就会为这个对象分配一些内存。

一个简单的语句,x=5;很明显我们知道这是将5赋值给x,但是x是什么呢?x就是变量。

一个变量就是一个简单的有名字的对象。

这一部分我们讨论的仅仅是整形变量,就是不带有小数或者分数的数字,例如-12,-4,0,5,9等等。一个整型变量就是一个储存整数的变量。

为了创建一个变量,我们需要使用到一个特殊的声明:定义。下面是一个变量的定义:

int x;

当这个语句被CPU执行的时候,RAM会分配一个内存给这个变量,叫做初始化。举个例子,假如CPU为其分配到了140这个位子,那么止呕每当CPU收到这个变量的时候就会去140这个位子查找。

对变量来说一个最简单的操作就是赋值,我们可以使用赋值语句来实现这一点,如下:

x=5;

当CPU解释这条语句的时候就是将值5放到140这个位置。之后在我们的程序里我们会通过std::cout >>x;将x的值输出到屏幕上

std::cout << x;  // prints the value of x (memory location 140) to the console
左值和右值:

在C++中变量都是左值,左值就是一个有确定地址的值。既然所有的变量都有一个地址,那么所有的变量都是左值。因为左值只能出现在语句的左边,所以叫做左值。当我们声明语句的时候,声明的左边必须是一个左值。如6 = 5就是错误的声明,因为6不是左值。6并没有占用内存空间,所以不能有其他值赋给他。当左值被赋值的时候,那么这个值的地址将会重新被写入新值。

与左值相反的是右值,右值是指与内存空间无关的值。典型的右值是常数,5,4或者表达式2+3+x之类的。右值往往是临时性的,在语句执行完成后就被丢弃了。

下面是一些声明语句的例子,显示右值是如何计算的:

int y;      // define y as an integer variable
y = 4;      // r-value 4 evaluates to 4, which is then assigned to l-value y
y = 2 + 5;  // r-value 2 + r-value 5 evaluates to r-value 7, which is then assigned to l-value y
 
int x;      // define x as an integer variable
x = y;      // l-value y evaluates to 7 (from before), which is then assigned to l-value x.
x = x;      // l-value x evaluates to 7, which is then assigned to l-value x (useless!)
x = x + 1;  // l-value x + r-value 1 evaluate to r-value 8, which is then assigned to l-value x.

让我们仔细看一下最后一个声明,因为可能会造成一些困惑。

x = x + 1;  // l-value x + r-value 1 evaluate to r-value 8, which is then assigned to l-value x.

在这个声明里x出现在了两个地方,在左边的x明显是一个左值,存储了一个数据。在右边的x代表生成的值,这个例子中是7,。其实该式子代表的是:

x=7+1

也就是C++把8赋值给了x

暂时来看,你没有必要过分担心分不清左右值。我们在后面比较高级的主题中还会谈到这个问题。

这里的关键是,声明为左值的部分必须要有一个存储空间,而右值则必须能够生成一个确定的值。

初始化 vs 赋值:

C++有两个类似的概念初学者经常搞混:初始化和赋值

在一个变量定义之后,必须通过=号给该变量赋值。

int x; // this is a variable definition
x = 5; // assign the value 5 to variable x

而另一种方式C++允许你在定义一个变量的同时进行赋值:

int x = 5; // initialize variable x with the value 5

变量只有在定义的时候才能初始化

尽管这两个概念非常相似,而且最终的结果相同。但是我们在以后的课程中将会学到一些类型的变量必须初始化,或者不需要赋值。因此在这里区分开这两种概念比较好。

规则:再给一个变量初始值的时候,优先考虑初始化,而不是赋值。

未初始化的变量:

不像其他的一些编程语言,C++不会给定义的变量主动赋初值的。因此如果你定义一个变量而没有初始化,那么这个变量可能是这块内存中的任意值。一个未赋初始值的变量称作未初始化的变量。

使用未初始化的变量将会生成异常的结果,如下:

// #include "stdafx.h" // Uncomment if Visual Studio user
#include <iostream>
 
int main()
{
    // define an integer variable named x
    int x; // this variable is uninitialized
    
    // print the value of x to the screen (dangerous, because x is uninitialized)
    std::cout << x;
 
    return 0;
}

在上面的例子里,我们定义了一个变量x,然后直接用cout输出到屏幕上。因为我们并没有赋初始值,所以x变量的这块内存中存储的数据可能是任意值,所以输出具有不确定性。

如果你的编译器对于未使用的变量编译失败的话,你可以执行下面的code:

// #include "stdafx.h" // Uncomment if Visual Studio user
#include <iostream>
 
void doNothing(const int &x)
{
}
 
int main()
{
    // define an integer variable named x
    int x; // this variable is uninitialized
 
    doNothing(x); // make compiler think we're using this variable
 
    // print the value of x to the screen (dangerous, because x is uninitialized)
    std::cout << x;
 
    return 0;
}

用未初始化的变量是新手常犯的一个错误,而且这样的错误导致异常之后,非常难以debug。

幸运的是,现在编译器多都能检测出未初始化的变量,并提醒程序员,例如:

c:vc2005projectstesttesttest.cpp(11) : warning C4700: uninitialized local variable 'x' used

编写程序一个好的经验法则就是初始化你的变量。这会让你的变量是一个确定的值,后期debug起来非常方便。

规则:确保你的所有变量都有初值

未定义的行为:

使用未初始化的变量是第一个未定位的行为。未定义的行为是出现了不是由代码所定义的结果。在这个方面,C++并没有明确的说明未定义的行为会出现什么结果。因此如果你真这么做了,那么出现的结果是未知的。

有未定义行为的代码可能会有以下几个问题:

  • 你的程序会生成一个始终错误的结果
  • 每次编译你的程序都会生成不同的结果
  • 你的程序执行不一致
  • 你的程序好像能够执行,但是执行结果不正确
  • 你的程序会崩溃,立即或者执行一会后
  • 你的程序能在一些编译上执行,但是其他的却不行
  • 你的程序只有在改了其他的无关程序后才能执行

或者你的程序可以正确地执行。未定义的行为指的是你永远不知道程序会生成什么结果,什么时候出问题,你是否会得得到正确的结果等等。

C++会由于不当的操作产生很多未定义的行为。我们在之后的课程中会讲解这些东西,并且尽可能的让你变面这些错误。

规则:一定要小心产生未定义的行为


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值