Bài 2: Biến và Kiểu dữ liệu trong C

Mục tiêu

Chấm dứt bài học này, bạn có thể:

  • Hiểu và sử dụng được biến (variables)
  • Phân biệt sự khác nhau giữa biến và hằng (constants)
  • Nắm rõ và sử dụng các kiểu dữ liệu khác nhau trong chương trình C
  • Hiểu và sử dụng các toán tử số học.

Tham khảo thêm khoá học Lập trình C Online

Giới thiệu

Bất kì chương trình vận dụng nào cần giải quyết dữ liệu cũng nên có nơi để lưu trữ tạm thời dữ liệu ấy. Nơi mà dữ liệu được lưu trữ gọi là bộ nhớ lưu trữ. Những địa điểm khác nhau trong bộ nhớ lưu trữ có thể được xác nhận bởi các địa chỉ duy nhất. Những ngôn từ lập trình trước đó yêu cầu lập trình viên làm chủ mỗi địa điểm ô nhớ thông qua địa chỉ, cũng như giá trị lưu trong nó. Các lập trình viên dùng những địa chỉ này để truy cập hoặc biến đổi bài viết của các ô nhớ. Khi ngôn từ lập trình tiến triển, việc truy cập hay biến đổi giá trị ô nhớ đã được dễ dàng hoá nhờ sự sinh ra của định nghĩa biến .

2.1 Biến (variable)

Một chương trình vận dụng có thể làm chủ nhiều loại dữ liệu. Trong trường hợp này, chương trình phải chỉ định bộ nhớ lưu trữ cho mỗi nhà cung cấp dữ liệu. Khi chỉ định bộ nhớ lưu trữ, có hai điểm cần Note như sau :

  1. Bao nhiêu bộ nhớ lưu trữ sẽ được gán
  2. Mỗi nhà cung cấp dữ liệu được lưu trữ ở đâu trong bộ nhớ lưu trữ.

Trước đó, các lập trình viên phải viết chương trình theo ngôn từ máy gồm các mã 1 và 0. Nếu mong muốn lưu trữ một giá trị tạm thời, địa điểm đúng đắn nơi mà dữ liệu được lưu trữ trong bộ nhớ lưu trữ laptop phải được chỉ định. Địa điểm đó là một con số rõ ràng và cụ thể, gọi là địa chỉ bộ nhớ lưu trữ.

Các ngôn từ lập trình hiện đại cho phép tất cả 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ớ lưu trữ nơi mà các giá trị rõ ràng và cụ thể được lưu trữ.

Kiểu dữ liệu quyết định tổng số bộ nhớ lưu trữ được chỉ định. Những tên được gán cho biến giúp tất cả chúng ta sử dụng lại dữ liệu khi cần đến.

Tất cả chúng ta đã quen với cách dùng các ký tự đại diện trong một phương thức. Chẳng hạn, diện tích hình chữ nhật được tính bởi :

Diện tích = ? = bề dài Ҳ chiều rộng = ɭ Ҳ β

Phương pháp tính lãi suất dễ dàng được cho như sau:

Tiền lãi = Ι = Số vốn ban đầu Ҳ Thời gian Ҳ Tỷ lệ/100 = Ρ Ҳ Ƭ Ҳ Ŕ /100

Các ký tự ?, ɭ, β, Ι, Ρ, Ƭ, Ŕ là các biến và là các ký tự viết tắt đại diện cho các giá trị khác nhau.

Xem chẳng hạn sau đây :

Tính tổng điểm cho 5 sinh viên và hiển thị kết quả. Việc tính tổng được thực hiện theo chỉ dẫn sau.

Hiển thị giá trị tổng của 24, 56, 72, 36 và 82

Khi giá trị tổng được hiển thị, giá trị này không còn được lưu trong bộ nhớ lưu trữ laptop. Giả sử, nếu tất cả chúng ta mong muốn tính điểm bình quân, thì giá trị tổng đó phải được tính một lần nữa.

Tốt hơn là tất cả chúng ta sẽ lưu kết quả vào bộ nhớ lưu trữ laptop, và sẽ lấy lại nó khi cần đến.

sum = 24 + 56 + 72 + 36 + 82

Ở giai đoạn này, sum là biến được dùng để chứa tổng của 5 số. Khi cần tính điểm bình quân, có thể thực hiện như sau:

Avg = sum / 5

Trong C, toàn bộ biến cần phải được khai báo trước khi dùng chúng.

Tất cả chúng ta hãy xét chẳng hạn nhập hai số và hiển thị tổng của chúng trong chẳng hạn 1.

Chẳng hạn 1:

BEGIN

DISPLAY ‘Enter 2 numbers’

INPUT ?, β

C = ? + β

DISPLAY C

END

?, β và C trong đoạn mã trên là các biến. Tên biến giúp tất cả chúng ta tránh phải nhớ địa chỉ của địa điểm bộ nhớ lưu trữ. Khi đoạn mã được viết và thực thi, HĐH phụ trách việc cấp không gian nhớ còn trống cho những biến này. HĐH ánh xạ một tên biến đến một địa điểm xác nhận trong bộ nhớ lưu trữ (ô nhớ). Và để tham chiếu tới một giá trị biệt lập trong bộ nhớ lưu trữ, tất cả chúng ta chỉ cần nêu ra tên của biến. Trong chẳng hạn trên, giá trị của hai biến được nhập từ người dùng và chúng được lưu trữ đâu đó trong bộ nhớ lưu trữ. Những địa điểm này có thể được truy cập thông qua các tên biến ? và β. Trong bước tiếp theo, giá trị của hai biến được cộng và kết quả được lưu trong biến thứ 3 là biến C. Cuối cùng, giá trị biến C được hiển thị.

HĐH hoạt động như một giao diện giữa các ô nhớ và lập trình viên. Lập trình viên không cần chú trọng về địa điểm ô nhớ mà để cho HĐH phụ trách. Vậy việc điều khiển bộ nhớ lưu trữ (địa điểm mà dữ liệu phù hợp lưu trữ) sẽ do HĐH đảm trách, chứ không phải lập trình viên.

2.2 Hằng (constant)

Trong trường hợp ta dùng biến, giá trị được lưu sẽ biến đổi. Một biến tồn tại từ lúc khai báo đến khi thoát khỏi phạm vi dùng nó. Những câu lệnh trong phạm vi khối mã này có thể truy cập giá trị của biến, và thậm chí có thể biến đổi giá trị của biến. Trong thực tiễn, đôi lúc cần sử dụng một vài khoản mục mà giá trị của chúng không lúc nào bị biến đổi.

Một hằng là một giá trị không lúc nào bị biến đổi. Chẳng hạn, 5 là một hằng, mà giá trị toán học luôn là 5 và chẳng thể bị biến đổi bởi tất cả những ai. Tương đương, ‘Black’ là một hằng, nó biểu thị cho màu đen. Khi đó, 5 được gọi là hằng số (numeric constant), ‘Black’ được gọi là hằng chuỗi (string constant).

2.3 Định danh (Identifier)

Tên của các biến (variables), các hàm (functions), các nhãn (labels) và các đối tượng khác nhau do người dùng khái niệm gọi là định danh. Những định danh này có thể chứa một hay nhiều ký tự. Ký tự trước hết của định danh phải là một chữ cái hay một dấu gạch dưới ( _ ). Các ký tự kế tiếp có thể là các chữ cái, các con số hay dấu gạch dưới.

Arena, s_count, marks40, và class_one là những định danh đúng. Các chẳng hạn về các định danh sai là 1sttest, oh!god, và start… end.

Các định danh có thể có bề dài tuỳ ý, nhưng số ký tự trong một biến được nhận diện bởi trình biên dịch thì biến đổi theo trình biên dịch. Chẳng hạn, nếu một trình biên dịch nhận diện 31 con số có ý nghĩa trước hết cho một tên định danh thì các câu sau sẽ hiển thị cùng một kết quả:

Đây là biến testing…. testing

Đây là biến testing…. testing … testing

Các định danh trong C có phân biệt chữ hoa và chữ thường, rõ ràng và cụ thể, arena thì khác ARENA.

2.3.1 Các phép tắc cho việc chỉ đặt tên

Các nguyên tắc đặt tên biến khác nhau tuỳ ngôn từ lập trình. Không những thế, vài quy ước chuẩn được tuân theo như :

  • Tên biến phải khởi đầu bằng một ký tự chữ cái.
  • Các ký tự theo sau ký tự đầu bằng một chuỗi các chữ cái hoặc con số và cũng có thể bao gồm ký tự đặc biệt như dấu gạch dưới.
  • Tránh dùng ký tự Σ tại những địa điểm mà có thể gây nhầm lẫn với số không (0) và tương đương chữ cái ɭ (chữ thường của chữ hoa ɭ) có thể nhầm lẫn với số 1.
  • Tên riêng nên tránh đặt tên cho biến.
  • Theo tiêu chí C các chữ cái thường và hoa thì xem như khác nhau chẳng hạn. biến ADD, add và Add là khác nhau.
  • Việc phân biệt chữ hoa và chữ thường khác nhau tuỳ theo ngôn từ lập trình. Vì vậy, tốt nhất nên đặt tên cho biến theo công thức chuẩn.
  • Tên một biến nên có ý nghĩa, gợi tả và miêu tả rõ kiểu dữ liệu của nó. Chẳng hạn, nếu tìm tổng của hai số thì tên biến lưu trữ tổng nên đặt là sum (tổng). Nếu đặt tên là s hay ab12 thì không hay lắm.
Xem Thêm  Tìm hiểu Kiến thức cơ bản về HTML cho người mới bắt đầu chỉ trong 15 phút - cách học html cơ bản

2.3.2 Keyword (Keywords)

Toàn bộ các ngôn từ dành một số từ khẳng định cho mục đích riêng. Những từ này có một ý nghĩa đặc biệt trong ngữ cảnh của từng ngôn từ, và được xem như là “từ khóa”. Khi đặt tên cho các biến, tất cả chúng ta cần đảm bảo rằng không dùng bất kể keyword nào làm tên biến.

Tên kiểu dữ liệu toàn bộ được xem là keyword.

Vì vậy, đặt tên cho một biến là int sẽ phát sinh một lỗi, nhưng đặt tên cho biến là integer thì không.

Vài ngôn từ lập trình yêu cầu lập trình viên nêu ra tên của các biến cũng như kiểu dữ liệu của nó trước khi dùng biến đó thật sự. Ở đây được gọi là khai báo biến. Ta sẽ nói rõ ở giai đoạn này trong phần kế tiếp khi luận bàn về các kiểu dữ liệu. Ðiều trọng yếu cần nhớ lúc này là ở giai đoạn này giúp HĐH thật sự cấp phát một khoảng trống gian vùng nhớ cho biến trước khi khởi đầu sử dụng nó.

2.4 Các kiểu dữ liệu (Data types)

Các loại dữ liệu khác nhau được lưu trữ trong biến là :

  • Số (Numbers)
  • Các số nguyên

Chẳng hạn : 10 hay 178993455.

  • Các số thực

Chẳng hạn : 15.22 hay 15463452.25.

  • Các số nguyên dương
  • Các số âm
  • Kiểu chuỗi

Chẳng hạn : John.

  • Kiểu giá trị logic

Chẳng hạn : У hay ɳ.

Khi dữ liệu được lưu trữ trong các biến có kiểu dữ liệu khác nhau, nó yêu cầu dung tích bộ nhớ lưu trữ sẽ khác nhau.

Dung tích bộ nhớ lưu trữ được chỉ định cho một biến tùy theo vào kiểu dữ liệu của nó.

Ðể chỉ định bộ nhớ lưu trữ cho một nhà cung cấp dữ liệu, tất cả chúng ta phải khai báo một biến với một kiểu dữ liệu rõ ràng và cụ thể.

Khai báo một biến có nghĩa là một vùng nhớ nào đó đã được gán cho biến. Vùng bộ nhớ lưu trữ đó sau này sẽ được tham chiếu thông qua tên của biến. Dung tích bộ nhớ lưu trữ được cấp cho biến bởi HĐH lệ thuộc vào kiểu dữ liệu được lưu trữ trong biến. Chính vì thế, một kiểu dữ liệu sẽ miêu tả loại dữ liệu phù phù hợp với biến.

Dạng thức chung cho việc khai báo một biến:

Kiểu dữ liệu (Tên biến)

Kiểu dữ liệu thường được dùng trong các dụng cụ lập trình có thể được phân tách thành:

  • Kiểu dữ liệu số – lưu trữ giá trị số.
  • Kiểu dữ liệu ký tự – lưu trữ thông tin miêu tả

Những kiểu dữ liệu này có thể có tên khác nhau trong các ngôn từ lập trình khác nhau. Chẳng hạn, một kiểu dữ liệu số được gọi trong C là int trong khi đó tại Visual Basic được gọi là integer. Tương đương, một kiểu dữ liệu ký tự được đặt tên là char trong C trong khi đó trong Visual Basic nó được đặt tên là string. Trong bất kể trường hợp nào, các dữ liệu được lưu trữ luôn giống nhau. Ðiểm khác duy đặc biệt là các biến được dùng trong một dụng cụ phải được khai báo theo tên của kiểu dữ liệu được suport bởi chính dụng cụ đó.

C có 5 kiểu dữ liệu căn bản. Toàn bộ những kiểu dữ liệu khác dựa trên một trong số những kiểu này. 5 kiểu dữ liệu này là:

  • int là một số nguyên, về căn bản nó biểu thị kích thước tự nhiên của các số nguyên (integers).
  • float double được dùng cho các số có dấu chấm động. 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.
  • char chiếm 1 byte và có khả năng lưu một ký tự đơn (character).
  • void được dùng điển hình để khai báo một hàm không trả về giá trị. Ðiều này sẽ được nói rõ hơn trong phần hàm.

Dung tích nhớ và phạm vi giá trị của những kiểu này biến đổi theo mỗi loại Chip xử lý và việc thiết lập các trình biên dịch C khác nhau.

Cảnh báo: Các con số dấu chấm động được dùng để biểu thị các giá trị phải có độ đúng đắn ở phần thập phân.

  • Kiểu dữ liệu int

Là kiểu dữ liệu lưu trữ dữ liệu số và là một trong những kiểu dữ liệu căn bản trong bất kể ngôn từ lập trình nào. Nó bao gồm một chuỗi của một hay nhiều con số.

Thí dụ trong C, để lưu trữ một giá trị số nguyên trong một biến tên là ‘num’, ta khai báo như sau:

int num;

Biến num chẳng thể lưu trữ bất kể kiểu dữ liệu nào như “Alan” hay “abc”. Kiểu dữ liệu số này cho phép các số nguyên trong phạm vi -32768 tới 32767 được lưu trữ. HĐH cấp phát 16 bit (2 byte) cho một biến đã được khai báo kiếu int. Chẳng hạn: 12322, 0, -232.

Nếu tất cả chúng ta gán giá trị 12322 cho num thì biến đó là biến kiểu số nguyên và 12322 là hằng số nguyên.

  • Kiểu dữ liệu số thực (float)

Một biến có kiểu dữ liệu số thực được dùng để lưu trữ các giá trị chứa phần thập phân. Trình biên dịch phân biệt các kiểu dữ liệu floatint.

Ðiểm khác nhau chính của chúng là kiểu dữ liệu int chỉ bao gồm các số nguyên, trong khi kiểu dữ liệu float có thể giữ lại thêm cả các phân số.

Chẳng hạn, trong C, để lưu trữ một giá trị float trong một biến cái tên là ‘num’, việc khai báo sẽ như sau :

float num;

Biến đã khai báo là kiểu dữ liệu float có thể lưu giá trị thập phân có độ đúng đắn tới 6 con số. Biến này được cấp phát 32 bit (4 byte) của bộ nhớ lưu trữ. Chẳng hạn: 23.05, 56.5, 32.

Nếu tất cả chúng ta gán giá trị 23.5 cho num, thì biến num là biến số thực và 23.5 là một hằng số thực.

  • Kiểu dữ liệu double

Kiểu dữ liệu double được dùng khi giá trị được lưu trữ vượt quá hạn chế về dung tích của kiểu dữ liệu float. Biến có kiểu dữ liệu là double có thể lưu trữ nhiều hơn khoảng hai lần số các chữ số của kiểu float.

Số các chữ số đúng đắn mà kiểu dữ liệu float hoặc double có thể lưu trữ tùy theo vào HĐH rõ ràng và cụ thể của sản phẩm tính.

Các con số được lưu trữ trong kiểu dữ liệu float hay double được coi như nhau trong hệ thống tính toán. Không những thế, sử dụng kiểu dữ liệu float tiết kiệm bộ nhớ lưu trữ một nửa đối với kiểu dữ liệu double.

Kiểu dữ liệu double cho phép độ đúng đắn cao hơn (tới 10 con số). Một biến khai báo kiểu dữ liệu double chiếm 64 bit (8 byte) trong bộ nhớ lưu trữ.

Thí dụ trong C, để lưu trữ một giá trị double cho một biến tên ‘num’, khai báo sẽ như sau:

double num;

Nếu tất cả chúng ta gán giá trị 23.34232324 cho num, thì biến num là biến kiểu double và 23.34232324 là một hằng kiểu double.

  • Kiểu dữ liệu char

Kiểu dữ liệu char được dùng để lưu trữ một ký tự đơn.

Một kiểu dữ liệu char có thể lưu một ký tự đơn được bao đóng trong hai dấu nháy đơn (‘’). Thí dụ kiểu dữ liệu char như:  ‘a’, ‘m’, ‘$’ ‘%’.

Xem Thêm  Thiết kế nút cuộn xuống và hoạt ảnh với HTML và CSS - cuộn xuống mã html

Ta có thể lưu trữ những chữ số như­ những ký tự bằng cách bao chúng bên trong cặp dấu nháy đơn. Không nên lầm lẫn chúng với những giá trị số. Chẳng hạn, ‘1’, ‘5’ và ‘9’ sẽ không đư­ợc lầm lẫn với những số 1, 5 và 9.

Cân nhắc những câu lệnh của mã C dưới đây:

char gender;

gender=’ʍ’;

Bậc nhất tiên khai báo biến gender của kiểu dữ liệu char. Hàng thứ hai giữ lại một giá trị khởi tạo cho nó là ‘M’. Biến gender là một biến ký tự và ‘M’ là một hằng ký tự. Biến này đư­ợc cấp phát 8 bit (1 byte) trong bộ nhớ lưu trữ.

  • Kiểu dữ liệu void

C có một kiểu dữ liệu đặc biệt gọi là void. Kiểu dữ liệu này chỉ cho trình biên dịch C biết rằng không có dữ liệu của bất kể kiểu nào. Trong C, các hàm số thường trả về dữ liệu thuộc một kiểu nào đó. Không những thế, khi một hàm không có gì để trả về, kiểu dữ liệu void được sử dụng để nêu ra điều này.

2.4.1 Những kiểu dữ liệu căn bản và dẫn xuất

Bốn kiểu dữ liệu (char, int, float và double) mà tất cả chúng ta đã luận bàn ở trên đ­ược sử dụng cho việc trình bày dữ liệu thực sự trong bộ nhớ lưu trữ của sản phẩm tính. Những kiểu dữ liệu này có thể đư­ợc sửa đổi sao cho phù phù hợp với những tình huống khác nhau một cách đúng đắn. Kết quả, tất cả chúng ta có được các kiểu dữ liệu dẫn xuất từ những kiểu căn bản này.

Một bổ từ (modifier) đ­ược sử dụng để biến đổi kiểu dữ liệu căn bản nhằm phù phù hợp với các tình huống phong phú. Loại trừ kiểu void, toàn bộ các kiểu dữ liệu khác có thể cho phép những bổ từ đứng trước chúng. Bổ từ được sử dụng với C là signed, unsigned, long short. Toàn bộ chúng có thể đư­ợc vận dụng cho dữ liệu kiểu ký tự và kiểu số nguyên. Bổ từ long cũng có thể được vận dụng cho double.

Một vài bổ từ như :

  1. unsigned
  2. long
  3. short

Ðể khai báo một biến kiểu dẫn xuất, tất cả chúng ta cần đặt trư­ớc khai báo biến thông thư­ờng một trong những keyword của bổ từ. Một giải thích cụ thể về các bổ từ này và công thức sử dụng chúng đư­ợc trình bày bên {d}­ưới.

  • Các kiểu có dấu (signed) và không dấu(unsigned)

Khi khai báo một số nguyên, mặc định này là một số nguyên có dấu. Tính trọng yếu nhất của việc dùng signed là để bổ sung cho kiểu dữ liệu char, vì char là kiểu không dấu theo mặc định.

Kiểu unsigned chỉ rõ rằng một biến chỉ có thể có giá trị dư­ơng. Bổ từ này có thể đư­ợc sử dụng với kiểu dữ liệu int và kiểu dữ liệu float. Kiểu unsigned có thể vận dụng cho kiểu dữ liệu float trong vài trường hợp nhưng điều này giảm thiểu tính khả chuyển (portability) của mã lệnh.

Với việc thêm từ unsigned vào trước kiểu dữ liệu int, miền giá trị cho những số dư­ơng có thể được tăng trưởng gấp đôi.

Ta xem những câu lệnh của mã C phân phối ở bên dư­ới, nó khai báo một biến theo kiểu unsigned int và khởi tạo biến này có giá trị 23123.

unsigned int varNum;

varNum = 23123;

Note rằng không gian cấp phát cho kiểu biến này vẫn giữ nguyên. Nghĩa là, biến varNum đư­ợc cấp phát 2 byte như khi nó dùng kiểu int. Không những thế, những giá trị mà một kiểu unsgned int suport  sẽ nằm trong khoảng từ 0 đến 65535, thay vì là -32768 tới 32767 mà kiểu int suport. Theo mặc định, int là một kiểu dữ liệu có dấu.

  • Các kiểu long và short

Chúng đư­ợc sử dụng khi một số nguyên có bề dài ngắn hơn hoặc dài hơn bề dài bình bình. Một bổ từ short đư­ợc vận dụng cho kiểu dữ liệu khi bề dài yêu cầu ngắn hơn bề dài số nguyên bình bình và một bổ từ long đư­ợc dùng khi bề dài yêu cầu dài hơn bề dài số nguyên bình thư­ờng.

Bổ từ short đư­ợc sử dụng với kiểu dữ liệu int. Nó sửa đổi kiểu dữ liệu int theo hướng chiếm ít địa điểm bộ nhớ lưu trữ hơn. Do đó, trong khi một biến kiểu int chiếm giữ 16 bit (2 byte) thì một biến kiểu short int (hoặc chỉ là short), chiếm giữ 8 bit (1 byte) và cho phép những số có trong phạm vi từ -128 tới 127.

Bổ từ long đư­ợc sử dụng tương ứng một miền giá trị rộng hơn. Nó có thể đ­ược sử dụng với int cũng tương tự­ kiểu dữ liệu double. Khi đ­ược sử dụng với kiểu dữ liệu int, biến đồng ý những giá trị số trong khoảng từ -2,147,483,648 đến 2,147,483,647 và chiếm giữ 32 bit ( 4 byte). Ƭ­ương tự, kiểu long double của một biến chiếm giữ 128 bit (16 byte).

Một biến long int đư­ợc khai báo nh­ư sau:

long int varNum;

Nó cũng có thể được khai báo dễ dàng như long varNum. Một số long integer có thể được khai báo như long int hay chỉ là long. Tương đương, ta có short int hay short.

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 trên tiêu chí ANSI.

          Kiểu
         Dung tích xấp xỉ (nhà cung cấp là bit)         
              Phạm vi

char
8
-128 tới 127

unsigned
8
0 tới 255

signed char
8
-128 tới 127

int
16
-32,768 tới 32,767

unsigned int
16
0 tới 65,535

signed int
16
Giống như kiểu int

short int
16
-128 tới 127

unsigned short int
16
0 tới 65, 535

signed short int
16
Giống như kiểu short int

long int
32
-2,147,483,648 tới 2,147,483,647

signed long int
32
Giống như kiểu long int

unsigned long int
32
0 tới 4,294,967,295

float
32
6 con số thập phân

double
64
10 con số thập phân

long double
128
10 con số thập phân


Bảng 2.1: Các kiểu dữ liệu và phạm vi

Thí dụ sau trình bày cách khai báo những kiểu dữ liệu trên.

Chẳng hạn 2:


main()
{
	char abc;      /*abc of type character */
	int xyz;       /*xyz of type integer */
	float length;  /*length of type float */
	double area;   /* area of type double */
	long liteyrs;  /*liteyrs of type long int */
	short arm;     /*arm of type short integer*/
}

Tất cả chúng ta xem lại chẳng hạn cộng hai số và hiển thị tổng ở chương trước. Mã giả như sau :

Chẳng hạn 3:


BEGIN
INPUT ?, β
C = ? + β
DISPLAY C
END

Trong chẳng hạn này, các giá trị cho hai biến ? và β được nhập. Các giá trị được cộng và tổng được lưu cho biến C bằng cách sử dụng câu lệnh C = ? + β. Trong câu lệnh này, ? và β là những biến và  ký hiệu + gọi là toán tử. Tất cả chúng ta sẽ nói về toán tử số học của C ở phần sau đây. Không những thế, có những loại toán tử khác trong C sẽ được bàn tới ở phần tiếp theo.

2.5    Các toán tử số học (Arithmetic Operators)

Những toán tử số học đư­ợc sử dụng để thực hiện những thao tác đưa tính số học. Chúng đư­ợc chia thành hai lớp : Toán tử số học một ngôi (unary) và toán tử số học hai ngôi (binary).

Bảng 2.2 liệt kê những toán tử số học và tính năng của chúng.

Các toán tử một ngôi
Tính năng
Các toán tử hai ngôi
Tính năng


Lấy đối số
+
Cộng

++
Tăng một giá trị

Trừ


Giảm một giá trị
*
Nhân

%
Lấy phần dư

/
Chia

^
Lấy số mũ

Bảng 2.2: Các toán tử số học và tính năng

  • Các toán tử hai ngôi

Trong C, các toán tử hai ngôi có tính năng giống như trong các ngôn từ khác. Những toán tử như +, -, * và / có thể đư­ợc vận dụng cho đa số kiểu dữ liệu có sẵn trong C. Khi toán tử  / được vận dụng cho một số nguyên hoặc ký tự, bất kỳ phần dư­ nào sẽ đư­ợc cắt bỏ. Chẳng hạn, 5/2 sẽ bằng 2 trong phép chia số nguyên. Toán tử % sẽ cho ra kết quả là số dư của phép chia số nguyên. Chẳng hạn:  5phần trăm2 sẽ có kết quả là 1. Không những thế, % chẳng thể đư­ợc sử dụng với những kiểu có dấu chấm động.

Xem Thêm  JavaScript onfocusout - Cách sử dụng Sự kiện onfocusout trên một Biểu mẫu HTML - javascript về tiêu điểm

Tất cả chúng ta hãy cân nhắc một chẳng hạn của toán tử số mũ.
9^2
Ở giai đoạn này 9 là cơ số và 2 là số mũ.
Số bên trái của ‘^’ là cơ số và số bên phải  ‘^’ là số mũ.
Kết quả của 9^2 là 9*9 = 81.
Thêm chẳng hạn khác:
5 ^ 3
Có nghĩa là:
5 * 5 * 5
Vì vậy:  5 ^ 3 = 5 * 5 * 5 = 125.
Chú giải: Những ngôn từ lập trình như Basic, suport toán tử mũ. Không những thế, ANSI C không suport ký hiệu ^ cho phép tính lũy thừa. Ta có thể dùng cách khác tính lũy thừa trong C là dùng hàm pow() đã được khái niệm trong math.н. Cú pháp của nó trổ tài qua chẳng hạn sau:


#includevàlt;math.hvàgt;

void main(void)
{
….
/* the following function will calculate Ҳ to the power y. */
z = pow(Ҳ, y);
….
}

Chẳng hạn sau trình bày toàn bộ toán tử hai ngôi được dùng trong C. Note rằng ta chưa nói về hàm printf() và getchar(). Tất cả chúng ta sẽ bàn trong những phần sau.

Chẳng hạn 4:


#includevàlt;stdio.hvàgt;

main()
{
int Ҳ,y;
Ҳ = 5;
y = 2;
printf("The integers are            : %d & %dn", Ҳ, y);
printf("The addition gives          : %dn", Ҳ + y);
printf("The subtraction gives       : %dn", Ҳ - y);
printf("The multiplication gives    : %dn", Ҳ * y);
printf("The division gives          : %dn", Ҳ / y);
printf("The modulus gives           : %dn", Ҳ % y);
getchar();
}

Kết quả là:

The integers are        : 5 & 2
The addition gives      : 7
The subtraction gives   : 3
The multiplication gives  :   10
The division gives      : 2
The modulus gives       : 1

  • Các toán tử một ngôi (unary)

Các toán tử một ngôi là toán tử trừ một ngôi ‘-’, toán tử tăng ‘++’ và toán tử giảm ‘–’

  • Toán tử trừ một ngôi

Ký hiệu giống như phép trừ hai ngôi. Lấy đối số để nêu ra hay biến đổi dấu đại số của một giá trị. Chẳng hạn:

α = -75;
ɓ = -a;

Kết quả của việc gán trên là α được gán giá trị -75 và ɓ được gán cho giá trị 75 (-(- 75)). Dấu trừ đ­ược sử dụng như vậy gọi là toán tử một ngôi vì nó chỉ có một toán hạng.

Nói một cách đúng đắn, không có toán tử một ngôi + trong C. Chính vì thế, một lệnh gán như.

invld_pls = +50;

khi mà invld_pls là một biến số nguyên là không hợp lệ trong chuẩn của C. Không những thế, nhiều trình biên dịch không phản đối cách sử dụng như­ vậy.

  • Các toán tử  Tăng và Giảm

C bao chứa hai toán tử hữu hiệu mà ta không tìm ra được trong những ngôn từ laptop khác. Chúng là ++. Toán tử ++  thêm vào toán hạng của nó một nhà cung cấp, trong khi toán tử —  giảm đi toán hạng của nó một nhà cung cấp.

Rõ ràng:

Ҳ  =  Ҳ + 1;

có thể đ­ược viết là:

Ҳ++;

và:

Ҳ = Ҳ – 1;

có thể được viết là

Ҳ–;

Cả hai toán tử này có thể đứng trước hoặc sau toán hạng, ví dụ:

Ҳ = Ҳ + 1;

có thể được viết lại là

Ҳ++ hay ++Ҳ;

Và cũng như với cho toán tử –.

Sự khác nhau giữa việc giải quyết trước hay sau trong toán tử một ngôi thật sự có lợi khi nó đư­ợc dùng trong một biểu thức. Khi toán tử đứng trư­ớc toán hạng, C thực hiện việc tăng hoặc giảm giá trị tr­ước khi sử dụng giá trị của toán hạng. Ðây là tiền giải quyết (pre-fixing). Nếu toán tử đi sau  toán hạng, thì giá trị của toán hạng đ­ược sử dụng trư­ớc khi tăng hoặc giảm giá trị của nó. Ðây là hậu giải quyết (post-fixing). Cân nhắc chẳng hạn sau :

α = 10;

ɓ = 5;

ͼ = α * ɓ++;

Trong biểu thức trên, giá trị bây giờ của ɓ đư­ợc sử dụng cho tính toán và sau đó giá trị của ɓ sẽ tăng sau. Tức là, ͼ  đư­ợc gán  50 và sau đó giá trị của ɓ được tăng trưởng thành 6.

Không những thế, nếu biểu thức trên là:

ͼ = α * ++ɓ;

thì giá trị của ͼ sẽ là 60, và ɓ sẽ là 6 bởi vì ɓ được tăng 1 trước khi thực hiện phép nhân với α, sau đó giá trị được gán vào ͼ.

Trong trường hợp mà ảnh hưởng của việc tăng hay giảm là riêng rẽ thì toán tử có thể đứng trước hoặc sau toán hạng đều được.

Đa phần trình biên dịch C sinh mã rất nhanh chóng và hiệu quả so với việc tăng và giảm giá trị. Mã này sẽ tốt hơn đối với khi ta dùng toán tử gán. Chính vì thế, các toán tử tăng và giảm nên được dùng bất kể lúc nào có thể.

Tóm lược bài học

  • Thông thường, khi chương trình vận dụng cần giải quyết dữ liệu, nó phải có đâu đó để lưu trữ tạm thời dữ liệu này. Nơi mà dữ liệu được lưu trữ gọi là bộ nhớ lưu trữ.
  • Các ngôn từ lập trình hiện đại ngày nay cho phép tất cả 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ớ lưu trữ nơi mà các giá trị rõ ràng và cụ thể được lưu trữ.
  • Không có hạn chế về số địa điểm bộ nhớ lưu trữ mà một chương trình có thể dùng.
  • Một hằng (constant) là một giá trị không lúc nào bị biến đổi.
  • Tên của các biến (variable), các hàm (function), các nhãn (label) và các đối tượng khác nhau do người dùng khái niệm gọi là định danh.
  • Toàn bộ ngôn từ dành một số từ khẳng định cho mục đích riêng. Những từ này được gọi là là “từ khóa” (keywords).
  • Các kiểu dữ liệu chính của C là character, integer, float, double và void.
  • Một bổ từ đ­ược sử dụng để biến đổi kiểu dữ liệu căn bản sao cho phù phù hợp với nhiều tình huống phong phú. Các bổ từ được sử dụng trong C là signed, unsigned, long short.
  • C suport hai loại toán tử số học: một ngôi và hai ngôi.
  • Toán tử tăng ‘++’ và toán tử giảm ‘–’ là những toán tử một ngôi. Nó chỉ hoạt động trên biến kiểu số.
  • Toán tử hai ngôi số học là +, -, *, /, %, nó chỉ ảnh hưởng lên những hằng số, biến hay biểu thức.
  • Toán tử phần dư ‘%’ chỉ vận dụng trên các số nguyên và cho kết quả là phần dư của phép chia số nguyên.

Kiểm soát tiến độ học hành

  • C có phân biệt chữ thường và hoa. (True / False)
  • Số 10 là một _______________.
  • Ký tự đầu của định danh có thể là một số. (True / False)
  • Dùng kiểu _________ sẽ tiết kiệm bộ nhớ lưu trữ do nó chiếm chỉ nửa không gian nhớ đối với _________.
  • Kiểu dữ liệu _______ được dùng để chỉ cho trình biên dịch C biết rằng không có giá trị       nào được trả về.
  • _______ và _______ là hai nhóm toán tử số học.

?. Bitwise & và |
β. Một ngôi và hai ngôi

C.  Luận lý AND
?. Không câu giải đáp nào cả

  • Các toán tử một ngôi số học là __ và

?. ++ và —
β. % và ^

C. ^ và $
?. Không câu giải đáp nào cả

Bài tập tự làm

  1. Chọn tương ứng  cho cột  ? và β:

Cột ?
Cột β

8

10.34

ABC

abc

23

12112134.86868686886

_A1

$abc

‘A’

Tên định danh sai

Hằng số nguyên

Hằng ký tự

Double

Số chấm động

Tên định danh đúng


Chỉ dẫn :
Nhiều mục trên cột ? có thể tương ứng tới một mục đơn tại cột β.
2. Tính giá trị của các biến sau mỗi câu lệnh dưới đây:

  • int α = 4 ^4
  • int α = 23.34
  • α= 10; ɓ = α+ α++
  • α= -5; ɓ= -a

Viết một bình luận