Biến và Kiểu dữ liệu trong Lập trình C Căn bản

MỤC LỤC

Biến và Kiểu dữ liệu

  • Định danh (Identifier)
    • Các kiểu dữ liệu (Data types)

      Các ngôn ngữ lập trình hiện đại cho phép chúng ta sử dụng các tên tượng trưng gọi là biến (variable), chỉ đến một vùng bộ nhớ nơi mà các giá trị cụ thể được lưu trữ. Trong khi một vài ngôn ngữ lập trình cho phép hệ điều hành xóa nội dung trong ô nhớ và cấp phát bộ nhớ này để dùng lại thì những ngôn ngữ khác như C yêu cầu lập trình viên xóa vùng nhớ không sử dụng thông qua mã chương trình. Kiểu float (số thực) chiếm 4 byte và có thể có tới 6 con số phần sau dấu thập phân, trong khi double chiếm 8 bytes và có thể có tới 10 con số phần thập phân.

      Bốn kiểu dữ liệu (char, int, float và double) mà chúng ta đã thảo luận ở trên được sử dụng cho việc trình bày dữ liệu thực sự trong bộ nhớ của máy tính. Một bổ từ short được áp dụng cho kiểu dữ liệu khi chiều dài yêu cầu ngắn hơn chiều dài số nguyên bình thường và một bổ từ long được dùng khi chiều dài yêu cầu dài hơn chiều dài số nguyên bình thường.  Các ngôn ngữ lập trình hiện đại ngày nay cho phép chúng ta sử dụng các tên tượng trưng gọi là biến (variable), dùng để chỉ đến một vùng trong bộ nhớ nơi mà các giá trị cụ thể được lưu trữ.

      Bảng dưới đây trình bày phạm vi giá trị cho các kiểu dữ liệu khác nhau và số bit nó chiếm giữ  dựa theo tiêu chuẩn ANSI.
      Bảng dưới đây trình bày phạm vi giá trị cho các kiểu dữ liệu khác nhau và số bit nó chiếm giữ dựa theo tiêu chuẩn ANSI.

      Mục tiêu

      Biểu thức (Expressions)

      Chúng ta thay thế mọi z với giá trị 15, và đơn giản hóa biểu thức theo quy tắc: thi hành phép toán trong dấu ngoặc trước tiên, kế đến lũy thừa, phép nhân và chia rồi phép cộng và trừ. Ðây là toán tử thông dụng nhất cho mọi ngôn ngữ và mọi người đều biết. Các phép toán thường được thực hiện theo một thứ tự cụ thể (hoặc riêng biệt) để cho ra giá trị cuối cùng.

      Các biểu thức toán học trong C được biểu diễn bằng cách sử dụng toán tử số học cùng với các toán hạng dạng số và ký tự. Như chúng ta thấy ở trên, toán hạng có thể là hằng, biến hay kết hợp cả hai. Chẳng hạn, trong biểu thức đầu, c/d là một biểu thức con, và trong biểu thức thứ ba c = 3+8 cũng là một biểu thức con.

      Toán tử quan hệ (Relational Operators)

      Hơn nữa, một biểu thức có thể là sự kết hợp của nhiều biểu thức con. Giả sử một chương trình phải thực thi những bước nhất định nếu điều kiện a < 10 và b == 7 được thoả mãn. Ðiều kiện này được viết ra bằng cách dùng toán tử quan hệ kết hợp với toán tử luận lý AND.

      Tương tự, toán tử OR dùng để kiểm tra xem có một trong số các điều kiện kiểm tra là đúng hay không. Toán tử luận lý thứ ba là NOT được biểu diễn bằng ký hiệu dấu chấm than ‘!’. Cả toán tử quan hệ và luận lý có quyền ưu tiên thấp hơn toán tử số học.

      Biểu thức dạng hỗn hợp & Chuyển đổi kiểu

        Nếu có một toán hạng là double, toán hạng còn lại sẽ được chuyển thành double, và kết quả là double. Nếu có một toán hạng là unsigned, toán hạng còn lại sẽ được chuyển thành unsigned và kết quả cũng là unsigned. Ngoài ra nếu một toán hạng là long và toán hạng khác là unsigned và giá trị của kiểu unsigned không thể biểu diễn bằng kiểu long.

        Sau khi áp dụng những quy tắc trên, mỗi cặp toán hạng có cùng kiểu và kết quả của mỗi phép tính sẽ cùng kiểu với hai toán hạng. Trong ví dụ trên, trước tiên, ch có kiểu ký tự được chuyển thành integer và float f được chuyển thành double. Trong ví dụ thứ hai, toán tử ép kiểu không đạt mục đích của nó bởi vì nó chỉ thực thi sau khi toàn biểu thức trong dấu ngoặc đã được tính.

        Độ ưu tiên của toán tử (Precedence)

        Ví dụ, đối với toán tử một ngôi: toán hạng nằm bên phải được tính trước, trong phép chia thì toán hạng bên trái được chia cho toán hạng bên phải. Hơn nữa, quy tắc từ trái sang phải cho phép toán nhân và chia bảo đảm rằng a sẽ được nhân với b và sau đó sẽ chia cho c. Bởi vì không thể xác định thứ tự tính toán các biểu thức con, do vậy, ta không nên dùng các biểu thức nếu giá trị biểu thức phụ thuộc vào thứ tự tính toán các biểu thức con.

        Do vậy, trong một biểu thức gồm cả ba kiểu toán tử, các toán tử số học được tính trước, kế đến là toán tử so sánh và sau đó là toán tử luận lý.  Khi một cặp dấu ngoặc đơn này được bao trong cặp khác, việc tính toán thực hiện trước tiên tại cặp dấu ngoặc đơn trong cùng nhất, rồi đến dấu ngoặc đơn bên ngoài. Dấu ngoặc đơn trong cùng sẽ được tính trước tất cả các toán tử khác và áp dụng quy tắc cơ bản trong bảng 4.6 cho tính toán bên trong cặp dấu ngoặc này.

        Bảng dưới đây trình bày thứ tự ưu tiên cho toán tử luận lý.
        Bảng dưới đây trình bày thứ tự ưu tiên cho toán tử luận lý.

        Nhập và Xuất trong C

        • Nhập và xuất trong C (Input and Output)

          Chúng có thể được dùng với kiểu: float, double hay char array (chuỗi-string).Bổ từ xác định độ rộng là một số nguyên xác định độ rộng nhỏ nhất của trường dữ liệu. Các dữ liệu có kích thước lớn hơn sẽ được in bằng cách dùng thêm những vị trí cho đủ yêu cầu.Ví dụ, %10f là lệnh định dạng cho các mục dữ liệu kiểu số thực với độ rộng trường dữ liệu thấp nhất là 10. Theo mặc định cho %f, chúng ta có thể thấy rằng có 6 con số cho phần thập phân và mặc định cho %e là một con số tại phần nguyên và 6 con số phần bên phải dấu chấm thập phân.

          Nếu chuỗi BEIJING CITY được nhập vào từ thiết bị nhập chuẩn, khi chương trình được thực thi, toàn bộ chuỗi sẽ được gán cho mảng một khi chuỗi chỉ toàn là ký tự viết hoa và khoảng trắng. Hàm getchar() được dùng để đọc dữ liệu nhập vào, chỉ một ký tự tại một thời điểm từ bàn phím.Trong hầu hết việc thực thi của C, khi dùng getchar(), các ký tự nằm trong vùng đệm cho đến khi người dựng nhấn phớm xuống dũng. Hãy dùng câu lệnh printf() để :. a) Xuất ra giá trị của biến số nguyên sum. c) Xuất ra biến ký tự letter. d) Xuất ra biến số thực discount. e) Xuất ra biến số thực dump có 2 vị trí phần thập phân.

          Bảng 4.1: Mã định dạng trong printf ()
          Bảng 4.1: Mã định dạng trong printf ()

          Điều kiện

          • Các câu lệnh lựa chọn

            Nếu trong ví dụ trên ta không đưa vào dấu ngoặc nhọn ở câu lệnh if, chỉ có câu lệnh đầu tiên (x += 5) được thực hiện khi điều kiện trong câu lệnh if là đúng. Ở trên chúng ta đã biết dạng đơn giản nhất của câu lệnh if, cho phép ta lựa chọn để thực hiện hay không một câu lệnh hoặc một chuỗI các lệnh. Nếu giá trị của biểu thức là false, câu lệnh sau else được chạy và chương trình hiển thị kí tự đó ra màn hình mà không cần thực hiện bất cứ sự thay đổI nào.

            Nếu chúng ta muốn thực hiện nhiều hơn một lệnh sau mỗi câu lệnh if hay else, ta phải đặt các câu lệnh đó vào trong cặp dấu ngoặc nhọn {}. Nếu điều kiện đó là true, câu_lệnh1 được thực hiện, nếu không câu_lệnh2 được thực hiện, sau đó chương trình thực hiện những lệnh trong câu lệnh kế tiếp. Vì lệnh else trong cấu trúc if-else là không bắt buộc, nên khi có lệnh else nào đó không được đưa vào trong chuỗi cấu trỳc if lồng nhau chương trỡnh sẽ trụng khụng rừ ràng.

            Lệnh if đầu tiên có lồng một if trong đó để hiển thị giá trị của y nếu người dùng nhập vào một giá trị nhỏ hơn 5 cho y, hoặc ngược lại sẽ hiển thị dòng chữ “The value of y exceeds 5”. Ví dụ, nếu mã sản phẩm được nhập vào là 1 và giá trị đặt hàng nhỏ hơn $300, thì không cần phải kiểm tra điều kiện, vì tất cả các khả năng đã được kiểm soát. Câu lệnh switch cho phép ta đưa ra quyết định có nhiều cách lựa chọn, nó kiểm tra giá trị của một biểu thức trên một danh sách các hằng số nguyên hoặc kí tự.

            Khi nó tìm thấy một giá trị trong danh sách trùng với giá trị của biểu thức điều kiện, các câu lệnh gắn với giá trị đó sẽ được thực hiện. Ở đó, switch, case và default là các từ khoá, chuỗi_câu_lệnh có thể là lệnh đơn hoặc lệnh ghép và không cần đặt trong cặp dấu ngoặc. Trong câu lệnh switch, biểu thức được xác định giá trị, giá trị của nó được so sánh với từng giá trị gắn với từng case theo thứ tự đã chỉ ra.

            Nếu không dùng lệnh break, các câu lệnh gắn với case bên dưới sẽ được thực hiện không kể giá trị của nó có trùng với giá trị của biểu thức điều kiện hay không.