c/c++ 左值 右值讨论
左值性(lvalueness)在C/C++中是表达式的一个重要属性。只有通过一个左值表达式才能来引用及更改一个对象(object)的值。(某些情况下,右值表达式也能引用(refer)到某一个对象,并且可能间接修改该对象的值,后述)。
何谓对象?如果没有明确说明,这里说的对象,和狭义的类/对象(class/object)相比,更为广泛。在C/C++中,所谓的对象指的是执行环境中一块存储区域(a region of storage),该存储区域中的内容则代表(represent)了该对象的值(value)。注意到我们这里所说的"代表",对于一个对象,如果我们需要取出(fetch)它的值,那么我们需要通过一定的类型(type)来引用它。使用不同的类型,对同一对象中的内容的解释会导致可能得到不同的值,或者产生某些未定义的行为。
在介绍左值之前,我们还需要引入一个概念: 变量(variable)。经常有人会把变量与对象二者混淆。什么叫变量?所谓变量是一种声明,通过声明,我们把一个名字(name)与一个对象对应起来,当我们使用该名字时,就表示了我们对该对象进行某种操作。但是并不是每个对象都有名字,也并不意味着有对应的变量。比如临时对象(temporary object)就没有一个名字与之关联(不要误称为临时变量,这是不正确的说法)。
1 C中的左值
1.1按照C的定义,左值是一个引用到对象的表达式,通过左值我们可以取出该对象的值。通过可修改的左值表达式(modifiable lvalue)我们还可以修改该对象的值。(需要说明的是,在C++中,左值还可以引用到函数,即表达式f如果引用的是函数类型,那么在C中它既不是左值也不是右值;而在C++中则是左值)。因为左值引用到某一对象,因此我们使用&对左值表达式(也只能对左值表达式和函数)取址运算时,可以获得该对象的地址(有两种左值表达式不能取址,一是具有位域( bit-field )类型,因为实现中最小寻址单位是 byte;另一个是具有register指定符,使用register修饰的变量编译器可能会优化到寄存器中)。
Ex1.1
char a[10]; // a is an lvalue representing an array of 10 ints.
char (* p)[10]=&a; // &a is the address of the array a.
const char* p="hello world"; //"hello world" is an lvalue of type char[12]
&
相关文档:
系统环境:Windows 7
软件环境:Visual C++ 2008 SP1 +SQL Server 2005
本次目的:编写一个航空管理系统
这是数据库课程设计的成果,虽然成绩不佳,但是作为我用VC++ 以来编写的最大程序还是传到网上,以供参考。用VC++ 做数据库设计并不容易,但也不是不可能。以下是我的程序界面,后面 ......
2009-12-24 21:15:41
TURBO C 2.0 文件分类
·原创·
网上下载TURBO C 2.0很混乱,一直想把她整理一下,使各个实例分开,各个不同部分分开。断断续续花了很长时间,到今天终于整理完了。发帖出来给大家看看。有需要的 ......
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd )
{
OPENFILENAME ofn;
//在内存中开辟一块空间,存放用户选取的文件名
char szFile[MAX_PATH];//MAX_PATH ......
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd )
{
OPENFILENAME ofn;
//在内存中开辟一块空间,存放用户选取的文件名
char szFile[MAX_PATH];//MAX_PATH ......
看数据结构裢栈的时候写了这么一段代码
#include<stdio.h>
#include<stdlib.h>
struct linkstack
{
int data;
struct linkstack *next;
};
int initstack(linkstack * S)
{
S = (linkstack *)malloc(sizeof(linkstack));
if(S == NULL) return 0;
S->next = NULL;
return 1;
}
int main(int ......