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

来源:互联网 发布:淘宝新店卖化妆品 编辑:程序博客网 时间:2024/04/30 15:20

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

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


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


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 这个表达式的结果就是一个左值。它指示一个对象!

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

原创粉丝点击