Toán tử tăng (increment) giảm (decrement)

Chào các bạn! Tiếp tục với khóa học lập trình C++ trực tuyến, trong bài học hôm nay, chúng ta tìm hiểu thêm 2 toán tử rất quan trọng thường xuyên được sử dụng trong ngôn ngữ lập trình C++.

###Toán tử tăng (increment operator)

Toán tử tăng (kí hiệu: ++) có thể đứng trước hoặc sau một biến (variable). Ví dụ:

int value = 5;
++value;
value++;

Cả hai vị trí đứng của toán tử tăng đều có chung một mục đích: Tăng giá trị của biến lên 1 đơn vị.

Nhưng chúng hoàn toàn khác nhau về mặt ngữ nghĩa.

Toán tử tăng khi làm tiền tố cho một biến rất dễ hiểu. Giá trị của x sẽ được tăng lên 1 đơn vị, sau đó giá trị mới sẽ được định cho biến x.

Ví dụ:

int x = 5;
int y = ++x; //giá trị của x bây giờ là 6, giá trị 6 sẽ được gán vào biến y

Toán tử tăng làm hậu tố của một biến có vẻ khó hiểu hơn một chút. Compiler sẽ tạo ra một bản sao của biến x hiện tại, tăng giá trị của biến x ban đầu lên 1 đơn vị, và sau đó định giá trị bằng bản sao của biến x. Ngay sau đó, bản sao của biến x sẽ bị loại bỏ.

Ví dụ:

int x = 5;
int y = x++; //giá trị của x bây giờ là 6, giá trị 5 ban đầu của x sẽ được gán cho y

Mình trình bày lại cách hoạt động của đoạn code trên thêm 1 lần nữa.

Đầu tiên, biến x được khai báo và khởi tạo giá trị ban đầu là 5. Tiếp theo, biến y được khai báo và gán cho giá trị là x++. Khi gặp toán tử tăng (++) làm hậu tố của biến x, compiler tạo ra một bản sao của biến x mang theo giá trị 5 ban đầu. Bây giờ, biến x gốc được tăng giá trị lên 1 đơn vị (x sẽ bằng 6), nhưng giá trị được gán cho biến y không phải là biến x ban đầu mà là bản sao của biến x (bản sao mang giá trị 5). Sau khi gán giá trị xong, bản sao của biến x bị xóa bỏ.

###Toán tử giảm

Toán tử giảm (kí hiệu: ) có thể làm tiền tố (đứng trước) hoặc hậu tố (đứng sau) một biến (variable). Ví dụ:

int value = 10;
--value;
value--;

Mục đích khi sử dụng toán tử này là để giảm giá trị của biến đi 1 đơn vị, nhưng có sự khác nhau giữa cách sử dụng tiền tố và hậu tố (tương tự toán tử tăng).

Cũng tương tự như mình đã trình bày cho toán tử tăng (++), toán tử giảm (–) khi làm tiền tố cho biến cũng khá đơn giản. Giá trị biến x sẽ bị trừ đi 1 đơn vị, mọi thao tác với biến x sẽ có hiệu lực trên giá trị mới ngay lập tức.

Ví dụ:

int x = 5;
int y = --x; //Giá trị của x bây giờ là 4, giá trị 4 được gán cho biến y

Đối với toán tử giảm (–) làm hậu tố cho biến, compiler cũng tạo ra một bản sao của biến x, giảm giá trị biến x đi 1 đơn vị, gán giá trị của bản sao biến x vào biến y, sau đó loại bỏ bản sao của biến x ra khỏi chương trình.

int x = 5;
int y = 5--; //Giá trị của biến x bây giờ là 4, giá trị 5 được gán cho biến y

###Tổng kết

Toán tử tăng, giảm là những toán tử được sử dụng khá thường xuyên trong thực tế. Các bạn cần nắm rõ bài học hôm nay trước khi đi tiếp những bài học tiếp theo.

Hẹn gặp lại các bạn trong các bài học tiếp theo của khóa học lập trình C++ hướng thực hành.

Mọi thắc mắc cần giải đáp trong khóa học này có thể được giải đáp bằng cách đặt câu hỏi tại forum diễn đàn.

www.daynhauhoc.com


Link Videos khóa học

6 Likes

cái này thiếu " ở phía sau dấu 2 chấm :slight_smile:

phần này hình như mình phải thêm thư viện cmath vào nó mới chạy cái pow :grin:
Vì em nghĩ khóa này dành cho cả những người “ngoại đạo” nữa nên mong anh chỉ dẫn thêm cho rõ ràng :grin:

3 Likes

cái này là ko xác định, bài tập cái gì ở đây??

tương tự cái này

cũng là ko xác định. Bỏ đi, viết bài tập khác.

4 Likes

Không xác định là sao nhỉ -_-

Có nghĩa là kết quả tuỳ thuộc vào cách mà compiler sử lý phép toán như thế nào, nên kết quả không xác định, tuỳ thuộc từng dòng compiler. :slight_smile:

Em vẫn chưa hiểu lắm. x++ thì giờ giá trị của x nó lên 3, xong cái --x là nó xuống 2 thì phải bằng 9 chưa nhỉ, sao ra console lại bằng 1 ??

x++ trả về copy của x trước khi tăng 1 nên làm gì pow(x++, --x) là pow(3,2) được. pow(++x, --x) thì còn có thể

cái này là ko xác định, tùy trình dịch mà kết quả nó ra khác nhau. Mấy cái bài tập kiểu này thì vứt hết đi. Nói nặng ra là nếu sách nào viết như vậy thì đốt sách đi.
http://rextester.com/LSUGMF94474 gcc cho ra kết quả 1
http://rextester.com/TSRA31910 clang cho kết quả 4
http://rextester.com/EBRF79923 vc++ cho kết quả 2

4 Likes

Vậy là bài tập sai hả bác @@. Học hành chả ra sao mà bài tập như này thì hoang mang quá !!

bài tập sai. Em post lên stackoverflow hỏi thử xem nhận được bao nhiêu câu chửi.

Anh cho em hỏi học C++ như anh thì sau mấy tháng mới có thể gọi là beginner ạ ?? Sau bao nhiêu nữa mới lên pro ?? Anh cứ nói thực nhớ chứ đừng ghi kiểu kiểu như tùy người hay là tương tự gì đó nha anh !! Thanks

6 tháng beginner (1 lớp intro to programming bằng C++)
xong 4 năm đh thì vẫn là intermediate, thậm chí vẫn có thể gọi là beginner.
expert thì mình ko phải expert nên ko dám phán

beginner là hiểu và biết sử dụng con trỏ, hàm, lớp.
intermediate là biết sử dụng STL container và algorithm, ko sử dụng con trỏ nữa, nắm vững OOP.
expert thì có thể đọc và viết template, viết thư viện định nghĩa các syntax trong C++, ví dụ

  Eigen::MatrixXf m(4,4);
  m <<  1, 2, 3, 4,
        5, 6, 7, 8,
        9,10,11,12,
       13,14,15,16;

ngoài ra expert chuyên sâu 1 lĩnh vực nên cũng khó mô tả chung chung.

3 Likes

Ngu như em chắc phải cỡ 5 đến 7 năm. Thanks bác đã cho lời khuyên.

Bị hiệu ứng lề.    

Anh @ltd hay @nguyenchiemminhvu đưa ra ý kiến đi

Trình độ C++ của mình chỉ ở mức beginner thôi bạn. Mình chỉ dám nhận viết phần C++ cơ bản này thôi, không viết được cho phần Qt và C++ OOP. Lý do duy nhất mình được chọn tham gia dự án C++ Tutorial này là mình có thời gian rãnh nhiều hơn các thành viên khác (vô công rồi nghề). Thế nên mình nghĩ mọi người đừng nên quá trông đợi những gì mình viết là đúng mà dùng nó như tài liệu tham khảo, đem cái mình viết đi hỏi người khác giỏi hơn xem như thế có đúng không. Mình post lên đây ai thấy chổ nào sai nếu có thời gian thì góp ý để mình sửa lại chổ đó.

5 Likes

@tntxtnt nói đúng rồi bạn. Cả hai ví dụ đó đều có đặc tính không xác định.

Chính xác là một cái là Undefined Behavior, cái còn lại là Unspecified Behavior.
Nhưng mình nghĩ người ra đề cố tình thôi.

Ủa sao a @Thesky xóa mất bài tập rồi :sweat_smile:
Mình thấy để vậy, tạo ra thắc mắc rồi tranh luận cũng hay mà.
P/s: Mới đầu tưởng cố tình để vậy là để tranh luận -> sau đó tổ lái sang Undefined behavior cho tới khi thấy xóa mất

1 Like

:joy: Chắc anh Vũ thấy không hợp nên edit lại rồi :smiley:
Mọi người đang chờ khóa video của anh Đạt là chính :joy:

1 Like

Không sao cả, có @tntxtnt nhắc thì mới biết được là tài liệu có đúng hay không.

Ta tìm bài tập khác phù hợp hơn, cảm ơn @tntxtnt rất nhiều :heart_eyes:

@drgnz mình chọn bài tập khác, bỏ bài đấy đi.

4 Likes

A post was split to a new topic: Anh Đạt còn khóa nào free nữa k?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?