C11标准学习(1)-----表达式、左值、对象、类型

原创 2013年12月02日 15:01:18

你不快乐是因为你可以像只猪一样懒,却无法像只猪一样懒得心安理得

                                                                                                                       -------不知名作者


今天系统学习了这几个概念。讨论概念的时候 会从性质出发。


1.对象

object,顾名思义,对象在C语言里 是真实存在的东西,说白了,就是内存中的一块存储区,有多个存储单元组成,且是整数个字节。可以知道,对象的属性只有一个,那就是地址,即该存储区从哪开始,记住,没说到哪结束,只有一个起始地址。

总结:对象---属性---->起始地址

2.表达式

 标准里这样写道:“An expression is a sequence of operators and operands that specifies computation of a value, or that designates an object or a function, or that generates side effects, or that performs a combination thereof. The value computations of the operands of an operator are sequenced before the value computation of the result of the operator.”

标准的意思是:表达式是由操作数 、操作符组成的一个序列,该序列要么用来计算一个值,要么用来指示一个对象或者一个函数。

既然表达式由操作数组成,而操作数可分为常量和变量

如:int a = 3; a = a + 3;这里a是变量,而3就是整型常量

看看表达式包括哪些东西

primary-expression:
identifier
constant
string-literal
( expression )

表达式包括了 标识符、常量、字符串字面值。从这里可以看出,标识符就是一个表达式,可谓最短表达式。

int a; 

a是个表达式,这个表达式就是一个designator,它指示一个对象,即一块内存存储区。在C语言里,可以说基本都是由表达式来组成的。标识符就是表达式。

3.类型

The meaning of a value stored in an object or returned by a function is determined by the
type of the expression used to access it. (An identifier declared to be an object is the
simplest such expression; the type is specified in the declaration of the identifier.)

标准的意思:存储在对象里的值(从这句就可以看出,对象是一块存储区)由什么决定?答案是 它由类型决定!类型?谁的类型?答案是访问这个对象的表达式的类型!!

总结一下:对象只是个存储区,单独的来考虑对象没什么意义,有意义的是存储在对象里面的东西。前面说了,对象只有起始地址,而存储在对象里的东西占多大空间,以及这个东西是什么,这些都由访问对象的表达式类型决定。怎么理解这句话。下面看个例子

int a = 3;

a是个表达式,它指示一个对象。a的类型是int .因此可以知道,存储在对象里的是整型3,且占4个字节的空间。因为表达式a的类型是int。现在是拿a去访问对象。只能拿表达式去访问对象。拿a去访问对象,那就得看a的类型是什么咯。根据这个类型 来解释存储在对象里面的值的意义!!

因此从上可以看出。对象是没类型的。类型是表达式的属性之一类型的作用就是来解释该对象内值的意义


4.左值

An lvalue is an expression (with an object type other than void) that potentially
designates an object;64)

这句话可以得出一下结论:

左值是表达式。

左值潜在的指示一个对象

现在可以得出结论:类型是用来描述表达式的,表达式的目的是用来计算数值或者访问对象的,表达式一定得有类型才能去访问对象,不然无法解释对象内的东西,表达式要成为左值的条件是,该表达式指示一个对象。即得有一块存储区跟该表达式关联!只要表达式是一个designator,那它就是一个左值。


总结:

看例子

int a = 3;//定义了一个对象,且用a这个标识符、表达式 来跟该对象关联,即a此时指示了一块存储区

*(char *)&a = 'a';//这里就是拿*(char *)&a这个表达式来访问该存储区。*(char *)&a的类型是char .

sizeof(*(char *)&a) 的值是1.

可知,存储在存储区的值可以有不同的解释,而不同的解释是由表达式的类型来决定的。类型决定了长度!


表达式的属性:1.类型 2.是不是左值

左值的属性:1.可修改对象 2.不可修改对象

类型的属性: 长度

对象的属性:起始地址


类型就是通过表达式来间接的描述对象。

表达式的结果 可能是一个左值(即指示一个对象),或者是一个值!

如a+b 这个表达式 结果就是一个值

a=b 赋值表达式,结果也是个值。该值为a的值

int *p = &a;

*p 这个表达式的结果就是一个左值。它指示一个对象!

不同的运算符,对于表达式影响的结果就是,表达式的值是不是一个左值。。。这得继续看标准。

左值表达式 右值表达式(C/C++)

何谓对象? 这里所说的对象是广义上的,而不仅仅是狭义的类/对象(class/object)。 在C/C++中,所谓的对象指的是执行环境中一块存储区域(a region of stora...
  • u012905667
  • u012905667
  • 2015年01月19日 17:43
  • 923

C++左值表达式

今天我们将要谈论的话题——左值表达式——相信不少人从各种途径中或许了解到一些,若是对这个概念还是模模糊糊,那接着看下去就对了,若是对这个概念十分清楚了,那就帮我找找问题,不吝赐教一下吧!     或...
  • oYinGui1
  • oYinGui1
  • 2014年03月06日 21:39
  • 1459

C11的标准特性

C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准。相比C99,C11有哪些变化呢—— 1、 对齐处理 alignof(T)返回T的对齐方式,aligne...
  • liujuan0827
  • liujuan0827
  • 2017年06月20日 09:32
  • 1366

表达式左值右值(C++学习)

左值右值是表达式的属性,该属性称为 value category。按该属性分类,每一个表达式属于下列之一: lvalue left value,传统意义上的左值...
  • dbzhang800
  • dbzhang800
  • 2011年08月05日 15:31
  • 4928

C11编辑器升级和C11标准使用

背景C11中的一些特性需要对应的编译器才能支持。而有些系统默认的编译器并不支持C11,所以需要4.8及其以上的版本。编译器升级原GCC版本:4.4.7; 目标:升级GCC到4.8.2,以支持C++1...
  • ljp1919
  • ljp1919
  • 2017年04月25日 20:15
  • 964

C89标准和C99标准C11标准的区别

注1: GCC支持C99, 通过 --std=c99 命令行参数开启,如: 代码: gcc --std=c99 test.c  注2:FFMPEG使用的是C99。而VC支持的是C89(不支...
  • xieyihua1994
  • xieyihua1994
  • 2016年05月07日 22:02
  • 9742

【C++11】nullptr关键字

转载于:http://blog.csdn.net/soaliap/article/details/7663865 从1972年C语言刚刚诞生以来,常数0就扮演着整数(int)0和空指针( null p...
  • afei198409
  • afei198409
  • 2013年12月18日 17:42
  • 7237

Access 标准表达式中数据类型不匹配

Access  标准表达式中数据类型不匹配 Access标准表达式中数据类型不匹配 今天在做一个小程序时,要求用到Access数据库,在调试运行一个SELECT语句时,老是提示标准表达式中数据类...
  • lt6210925
  • lt6210925
  • 2014年05月08日 10:08
  • 1280

(23)成员访问运算符、条件运算符、逗号运算符

成员访问运算符有两种: 一.点运算符:获取类对象的一个成员。如果成员所属的对象是左值,那么结果是左值;反之,如果成员所属的对象是右值,那么结果 是右值。 二.箭头运算符:作用于一个指针类型的运算对象,...
  • zl908760230
  • zl908760230
  • 2016年11月07日 17:32
  • 193

C++中出现“IntelliSense: 表达式必须是可修改的左值”的Bug解决

说明:在学习算法导论,需要写一嵌套的小程序,题目是: Consider a three-parameter recursive function w(a, b, c): if a 1 if ...
  • wqthaha
  • wqthaha
  • 2015年01月17日 17:10
  • 2276
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C11标准学习(1)-----表达式、左值、对象、类型
举报原因:
原因补充:

(最多只允许输入30个字)