数据类型

The data types of a language are a large part of what determines that language’s style and usefulness. The primitive data types of most imperative languages include numeric, character, and Boolean types. The user-defined enumeration and subrange types are convenient and add to the readability and reliability of programs. Arrays and records are included in most languages. Pointers are used for addressing flexibility and to control dynamic storage management.
展开查看详情

1.Chapter 6 Data Types

2.Copyright © 2015 Pearson. All rights reserved. 1- 2 Chapter 6 Topics Introduction Primitive Data Types Character String Types Enumeration Types Array Types Associative Arrays Record Types Tuple Types List Types Union Types Pointer and Reference Types Type Checking Strong Typing Type Equivalence Theory and Data Types

3.Copyright © 2015 Pearson. All rights reserved. 1- 3 Introduction A data type defines a collection of data objects and a set of predefined operations on those objects A descriptor is the collection of the attributes of a variable An object represents an instance of a user-defined (abstract data) type One design issue for all data types: What operations are defined and how are they specified?

4.Copyright © 2015 Pearson. All rights reserved. 1- 4 Primitive Data Types Almost all programming languages provide a set of primitive data types Primitive data types: Those not defined in terms of other data types Some primitive data types are merely reflections of the hardware Others require only a little non-hardware support for their implementation

5.Copyright © 2015 Pearson. All rights reserved. 1- 5 Primitive Data Types: Integer Almost always an exact reflection of the hardware so the mapping is trivial There may be as many as eight different integer types in a language Java’s signed integer sizes: byte , short , int , long

6.Copyright © 2015 Pearson. All rights reserved. 1- 6 Primitive Data Types: Floating Point Model real numbers, but only as approximations Languages for scientific use support at least two floating-point types (e.g., float and double ; sometimes more Usually exactly like the hardware, but not always IEEE Floating-Point Standard 754

7.Copyright © 2015 Pearson. All rights reserved. 1- 7 Primitive Data Types: Complex Some languages support a complex type, e.g., C99, Fortran, and Python Each value consists of two floats, the real part and the imaginary part Literal form (in Python): (7 + 3j) , where 7 is the real part and 3 is the imaginary part

8.Copyright © 2015 Pearson. All rights reserved. 1- 8 Primitive Data Types: Decimal For business applications (money) Essential to COBOL C# offers a decimal data type Store a fixed number of decimal digits, in coded form (BCD) Advantage : accuracy Disadvantages : limited range, wastes memory

9.Copyright © 2015 Pearson. All rights reserved. 1- 9 Primitive Data Types: Boolean Simplest of all Range of values: two elements, one for “true” and one for “false” Could be implemented as bits, but often as bytes Advantage: readability

10.Copyright © 2015 Pearson. All rights reserved. 1- 10 Primitive Data Types: Character Stored as numeric codings Most commonly used coding: ASCII An alternative, 16-bit coding: Unicode (UCS-2) Includes characters from most natural languages Originally used in Java C# and JavaScript also support Unicode 32-bit Unicode (UCS-4) Supported by Fortran, starting with 2003

11.Copyright © 2015 Pearson. All rights reserved. 1- 11 Character String Types Values are sequences of characters Design issues: Is it a primitive type or just a special kind of array? Should the length of strings be static or dynamic?

12.Copyright © 2015 Pearson. All rights reserved. 1- 12 Character String Types Operations Typical operations: Assignment and copying Comparison (=, >, etc.) Catenation Substring reference Pattern matching

13.Copyright © 2015 Pearson. All rights reserved. 1- 13 Character String Type in Certain Languages C and C++ Not primitive Use char arrays and a library of functions that provide operations SNOBOL4 (a string manipulation language) Primitive Many operations, including elaborate pattern matching Fortran and Python Primitive type with assignment and several operations Java Primitive via the String class Perl, JavaScript, Ruby, and PHP - Provide built-in pattern matching, using regular expressions

14.Copyright © 2015 Pearson. All rights reserved. 1- 14 Character String Length Options Static: COBOL, Java’s String class Limited Dynamic Length : C and C++ In these languages, a special character is used to indicate the end of a string’s characters, rather than maintaining the length Dynamic (no maximum): SNOBOL4, Perl, JavaScript

15.Copyright © 2015 Pearson. All rights reserved. 1- 15 Character String Type Evaluation Aid to writability As a primitive type with static length, they are inexpensive to provide--why not have them? Dynamic length is nice, but is it worth the expense?

16.Copyright © 2015 Pearson. All rights reserved. 1- 16 Character String Implementation Static length: compile-time descriptor Limited dynamic length: may need a run-time descriptor for length (but not in C and C++) Dynamic length: need run-time descriptor; allocation/deallocation is the biggest implementation problem

17.Copyright © 2015 Pearson. All rights reserved. 1- 17 Compile- and Run-Time Descriptors Compile-time descriptor for static strings Run-time descriptor for limited dynamic strings

18.Copyright © 2015 Pearson. All rights reserved. 1- 18 User-Defined Ordinal Types An ordinal type is one in which the range of possible values can be easily associated with the set of positive integers Examples of primitive ordinal types in Java integer char boolean

19.Copyright © 2015 Pearson. All rights reserved. 1- 19 Enumeration Types All possible values, which are named constants, are provided in the definition C# example enum days {mon, tue, wed, thu, fri, sat, sun}; Design issues Is an enumeration constant allowed to appear in more than one type definition, and if so, how is the type of an occurrence of that constant checked? Are enumeration values coerced to integer? Any other type coerced to an enumeration type?

20.Copyright © 2015 Pearson. All rights reserved. 1- 20 Evaluation of Enumerated Type Aid to readability, e.g., no need to code a color as a number Aid to reliability, e.g., compiler can check: operations (don’t allow colors to be added) No enumeration variable can be assigned a value outside its defined range C# and Java 5.0 provide better support for enumeration than C++ because enumeration type variables in these languages are not coerced into integer types

21.Advanced Data Types Arrays, Records, Variable Records, Classes, etc. all Have Sizes that are Known at Compile Time Dynamic Types (Lists, Sets, etc.) have Fixed Component Sizes (Size of List Element), but are Allocated at Runtime For Static Types Run Time We must Compute Addresses of Variable References Anticipate this Need at Compile Time to Simplify and Speed Access For Dynamic Types Consider their Definition and Usage We’ll Briefly Review Arrays …

22.Copyright © 2015 Pearson. All rights reserved. 1- 22 Array Types An array is a homogeneous aggregate of data elements in which an individual element is identified by its position in the aggregate, relative to the first element.

23.Copyright © 2015 Pearson. All rights reserved. 1- 23 Array Design Issues What types are legal for subscripts? Are subscripting expressions in element references range checked? When are subscript ranges bound? When does allocation take place? Are ragged or rectangular multidimensional arrays allowed, or both? What is the maximum number of subscripts? Can array objects be initialized? Are any kind of slices supported?

24.Copyright © 2015 Pearson. All rights reserved. 1- 24 Array Indexing Indexing (or subscripting) is a mapping from indices to elements array_name (index_value_list)  an element Index Syntax Fortran and Ada use parentheses Ada explicitly uses parentheses to show uniformity between array references and function calls because both are mappings Most other languages use brackets

25.Copyright © 2015 Pearson. All rights reserved. 1- 25 Arrays Index (Subscript) Types FORTRAN, C: integer only Java: integer types only Index range checking - C, C++, Perl, and Fortran do not specify range checking - Java, ML, C# specify range checking

26.Copyright © 2015 Pearson. All rights reserved. 1- 26 Subscript Binding and Array Categories Static : subscript ranges are statically bound and storage allocation is static (before run-time) Advantage: efficiency (no dynamic allocation) Fixed stack-dynamic : subscript ranges are statically bound, but the allocation is done at declaration time Advantage: space efficiency

27.Copyright © 2015 Pearson. All rights reserved. 1- 27 Subscript Binding and Array Categories (continued) Fixed heap-dynamic : similar to fixed stack-dynamic: storage binding is dynamic but fixed after allocation (i.e., binding is done when requested and storage is allocated from heap, not stack)

28.Copyright © 2015 Pearson. All rights reserved. 1- 28 Subscript Binding and Array Categories (continued) Heap-dynamic: binding of subscript ranges and storage allocation is dynamic and can change any number of times Advantage: flexibility (arrays can grow or shrink during program execution)

29.Copyright © 2015 Pearson. All rights reserved. 1- 29 Subscript Binding and Array Categories (continued) C and C++ arrays that include static modifier are static C and C++ arrays without static modifier are fixed stack-dynamic C and C++ provide fixed heap-dynamic arrays C# includes a second array class ArrayList that provides fixed heap-dynamic Perl, JavaScript, Python, and Ruby support heap-dynamic arrays