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++11时代的标准库快餐教程(1) - 不同类型值组成的简单列表

std::pair是C++98就有的功能,std::tuple是TR1新增的。C++11的两个特性为pair和tuple带来很大帮助,一个是auto的类型推断可以帮助我们少写代码,二是C++11支持变...
  • lusing
  • lusing
  • 2016年10月10日 19:37
  • 577

C标准库源码解剖(11):扩展整数类型stdint.h和inttypes.h

C语言的基本精神是让实现选择标准类型的长度,但是这种指导思想使可移植代码难以编写。C99中引入了stdint.h和inttypes.h,对整数类型的定义和格式转换进行了规范。这种扩展整数类型的定义非常...

C标准库源码解剖(1):类型相关的定义

C标准库源码解剖(1):类型相关的定义 分类: C语言&嵌入式2009-09-30 13:53 1619人阅读 评论(1) 收藏 举报 cgcc编译器float平台include ...

【2015/11/1】C学习日志_Day11&12 数据类型 指针 内存对齐 函数指针

/************************************************************************* > File Name: class.c ...
  • hsgwpj
  • hsgwpj
  • 2015年11月01日 20:36
  • 541

C++学习笔记——标准库类型vector(1)

一、vector初始化的一些实例  1、vector v1;                                  //v1是一个空vector,元素为int类型,执行默认初始化  2...

C++ 11 学习1:类型自动推导 auto和decltype

Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习。 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译...

【IOS 开发学习总结-OC-11】★objective-c面向对象之——封装和访问控制符

封装封装的定义面向对象的三大特征(封装,继承,多态)之一。指的是:将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。良好的封装,...

Objective-C 2.0 学习笔记三(数据类型和表达式)

变更履历 版本:v1.0 简介 这一章主要描述 OC 的基本数据类型,并描述一些用于构成算术表达式的基本规则。 数据类型和常量 在 Objective-C 中,任何数字、单个字符或者字符串通...

《C程序设计语言》学习笔记(二)——类型、运算符与表达式

Book2.2 转义字符序列: ‘\ooo’:1~3个八进制数字,表示该字符常量的数值 ‘\xhh’:1~2个十六进制数字,表示该字符常量的数值 ‘\’:一个反斜杠 ‘\?’:一个问号 ‘...

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第四章 数据类型和表达式

本章内容相对比较基础,容易理解。过于简单繁琐的内容在此不再赘述。这里只讲解本章的框架和比较重要的细节部分。 Part1. 数据类型和常量 基本数据类型 int: 值域和运行计算机的硬件设...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C11标准学习(1)-----表达式、左值、对象、类型
举报原因:
原因补充:

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