Parameter Là Gì Trong C / Top 5 # Xem Nhiều Nhất & Mới Nhất 2/2023 # Top View | 2atlantic.edu.vn

Bitwise Operators Trong C/C++ Là Gì?

Bitwise Operator là gì?

Trong C, 6 toán tử sau được xếp vào bitwise operators (toán tử vận hành ở cấp bit)

& (bitwise AND) lấy hai số làm toán hạng và thực hiện AND lên từng bit của hai số này. Kết quả của AND sẽ chỉ là 1 cả hai bit đều cùng là 1.

^ (bitwise XOR) lấy hai số làm toán hạng và thực hiện XOR lên từng bit của hai số này. Kết quả của XOR là 1 nếu hai bit khác nhau.

<< (left shift) Lấy hai số, chuyển bits của toán hạng đầu tiên sang trái, toán hạng thứ hai quyết định số chỗ trống cần dịch chuyển.

Bitwsie operator trong C

~ (bitwise NOT) Lấy một số và nghịch đảo tất cả bit của số đó.

1) Không sử dụng các toán tử left shift và right shift cho số âm. Nếu bất kỳ toán hạng nào là số âm, kết quả sẽ là hành vi không xác định. Ví dụ: kết quả của cả -1 << 1 và 1 << -1 là không xác định. Ngoài ra, nếu số được shift nhiều hơn kích thước của số nguyên đó, hành vi cũng là không xác định. Ví dụ: 1 << 33 không xác định nếu số nguyên được lưu trữ với 32 bit.2) Toán tử bitwise XOR là toán tử hữu ích nhất cho những buổi phỏng vấn technical. Nó được sử dụng để giải quyết rất nhiều vấn đề. Một ví dụ đơn giản: Được đưa ra một tập hợp các số trong đó tất cả các phần tử xảy ra số lần chẵn trừ một số, tìm số xảy ra lẻ lẻ Vấn đề này có thể được giải quyết một cách hiệu quả bằng cách thực hiện XOR tất cả các số.

4) Toán tử left-shift và right-shift tương đương với phép nhân và chia cho 2 tương ứng.Như đã đề cập ở điểm 1, hai toán tử này chỉ làm việc với số dương.

5) Toán tử & có thể được sử dụng để nhanh chóng kiểm tra xem một số là số lẻ hay chẵnGiá trị của biểu thức (x & 1) sẽ khác không chỉ khi x là số lẻ, nếu không giá trị sẽ bằng không.

6) Toán tử ~ nên được sử dụng một cách cẩn thậnKết quả của toán tử ~ trên một số nhỏ có thể là một số lớn nếu kết quả được lưu trữ trong một biến unsigned. Và kết quả có thể là một số âm nếu kết quả được lưu trữ trong một biến signed (giả sử rằng các số âm được lưu trữ ở dạng bổ sung của 2, trong đó bit ngoài cùng bên trái là sign bit).

C++ — Biểu Thức Lambda Trong C++ 11 Là Gì?

namespace { struct f { void operator()(int) { } }; }

f f; std::for_each(v.begin(), v.end(), f); } struct { void operator()(int) { } } f; std::for_each(v.begin(), v.end(), f); } std::for_each(v.begin(), v.end(), [](int) { /* do something here*/ }); } std::transform(v.begin(), v.end(), v.begin(), [](double d) { return d < 0.00001 ? 0 : d; } ); } std::transform(v.begin(), v.end(), v.begin(), [](double d) { if (d < 0.0001) { return 0; } else { return d; } }); } std::transform(v.begin(), v.end(), v.begin(), if (d < 0.0001) { return 0; } else { return d; } }); } std::transform(v.begin(), v.end(), v.begin(), if (d < epsilon) { return 0; } else { return d; } }); }

Bạn có thể chụp theo cả tham chiếu và giá trị, mà bạn có thể chỉ định bằng cách sử dụng & và = tương ứng:

[&epsilon] chụp bằng tham chiếu

[&] ghi lại tất cả các biến được sử dụng trong lambda bằng cách tham chiếu

[=] nắm bắt tất cả các biến được sử dụng trong lambda theo giá trị

[&, epsilon] ghi lại các biến như với [&], nhưng epsilon theo giá trị

[=, &epsilon] chụp các biến như với [=], nhưng epsilon bằng cách tham chiếu

Theo mặc định, operator() được tạo là const, với hàm ý rằng các ảnh chụp sẽ là const khi bạn truy cập chúng theo mặc định. Điều này có tác dụng là mỗi cuộc gọi có cùng một đầu vào sẽ tạo ra cùng một kết quả, tuy nhiên bạn có thể đánh dấu lambda là mutable để yêu cầu operator() được tạo ra không phải là const.

Con Trỏ This Trong C++ Là Gì?

Mỗi đối tượng trong C++ có sự truy cập tới vị trí riêng của nó thông qua một con trỏ quan trọng gọi là con trỏ this. Con trỏ this trong C++ là một từ khóa đề cập đến thể hiện hiện tại của lớp, là một tham số ẩn với tất cả hàm thành viên. Vì thế, bên trong một hàm thành viên, con trỏ this có thể tham chiếu tới đối tượng đang gọi.

Các hàm friend không có con trỏ this, bởi vì friend không phải là các thành viên của một lớp. Chỉ có các hàm thành viên trong C++ là có con trỏ this.

Ví dụ con trỏ this trong C++

Hãy xem ví dụ sau để hiểu về con trỏ this trong C++:

VD1: Sử dụng con trỏ this bên trong Constructor để gán giá trị cho đối tượng hiện tại:

#include <iostream> using namespace std; class Employee { public: int id; string name; float salary; Employee(int id, string name, float salary) { this->id = id; this->name = name; this->salary = salary; } void display() { cout << id << " " << name << " " << salary << endl; } }; int main(void) { Employee e1 = Employee(101, "Phan Van Vinh", 500); Employee e2 = Employee(102, "Dao Van Hoa", 1000); e1.display(); e2.display(); return 0; }

Kết quả:

101 Phan Van Vinh 500 102 Dao Van Hoa 1000

VD2: So sánh thể tích của 2 hình hộp:

#include <iostream> using namespace std; class Box { private: double chieudai; double chieurong; double chieucao; public: Box(double chieudai, double chieurong, double chieucao) { this->chieudai = chieudai; this->chieurong = chieurong; this->chieucao = chieucao; } double theTich() { return chieudai * chieurong * chieucao; } int sosanh(Box box) { if (this->theTich() > box.theTich()) { return 1; } else if (this->theTich() > box.theTich()) { return 0; } else { return -1; } } }; int main(void) { Box box1 = Box(2.5, 4, 2); Box box2 = Box(4.5, 2, 3); if (box1.sosanh(box2) == 1) { cout << "Box1 co the tich lon hon Box2" << endl; } else if (box1.sosanh(box2) == 0) { cout << "Box1 co the tich bang Box2" << endl; } else { cout << "Box1 co the tich nho hon Box2" << endl; } return 0; }

Kết quả:

Box1 co the tich nho hon Box2

Mảng Ký Tự Trong C++ (C

Dẫn nhập

Hôm nay, mình sẽ giới thiệu cho các bạn về Mảng ký tự trong C++ (C-style strings).

Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về:

Trong bài ta sẽ cùng tìm hiểu các vấn đề:

Mảng ký tự (C-style strings) là gì?

Khai báo và khởi tạo mảng ký tự (C-style strings)

Xuất mảng ký tự (C-style strings) với std::cout

Nhập mảng ký tự (C-style strings) với std::cin

Mảng ký tự (C-style strings) là gì?

Trong bài học CƠ BẢN VỀ CHUỖI KÝ TỰ TRONG C++ (An introduction to std::string), bạn đã biết được chuỗi ký tự là tập hợp các ký tự tuần tự, được đặt trong dấu ngoặc kép. Dùng để biểu diễn những thông báo, văn bản, … trong chương trình.

Ví dụ: “Hello, HowKteam.com!” chính là một chuỗi ký tự.

Ngôn ngữ C++ có 2 loại chuỗi ký tự khác nhau:

Chuỗi ký tự

std

::

string

được cài đặt trong một lớp của thư viện chuẩn STL.

Chuỗi ký tự C-style nguyên bản từ ngôn ngữ C.

Kiểu chuỗi ký tự std::string được xây dựng từ chuỗi ký tự C-style. Vì vậy, chuỗi ký tự std::string thường được sử dụng trong C++ vì tính đơn giản, và dễ sử dụng của nó.

Trong bài học này, chúng ta sẽ tìm hiểu bản chất và cách sử dụng của kiểu C-style strings.

Chuỗi ký tự C-style bản chất là mảng 1 chiều các ký tự, kết thúc bằng ký tự ‘’ (null). Hay còn gọi là null-terminated string.

Ví dụ:

char sz[] = "Kteam";

Hình bên dưới mô tả 1 C-style string tên là sz có kiểu char gồm 6 phần tử (5 ký tự thường, và 1 ký tự null ‘’) nằm trong vùng nhớ RAM:

Chuỗi ký tự sz được khởi tạo 5 phần tử, nhưng chuỗi ký tự C-style luôn mặc định kết thúc bằng ký tự null ‘’, nên chuỗi sz sẽ có 6 phần tử.

Khai báo và khởi tạo mảng ký tự (C-style strings)

Khai báo mảng ký tự (C-style strings)

Cú pháp khai báo tương tự như cách khai báo mảng 1 chiều.

Ví dụ:

char szFullName[30]; // Dài 29 ký tự char szDayOfBirth[9];

Khởi tạo giá trị cho mảng ký tự (C-style strings)

Cách 1: Khởi tạo với độ dài cụ thể.

char sz[10] = { 'K', 't', 'e', 'a', 'm', '' }; char sz[10] = "Kteam";

Cách 2: Khởi tạo tự động xác định độ dài.

char sz[] = { 'K', 't', 'e', 'a', 'm', '' }; char sz[] = "Kteam";

Bản chất của mảng ký tự cũng là mảng 1 chiều, nghĩa là bạn có khởi tạo chuỗi ký tự, nhưng bạn không thể gán chuỗi ký tự trực tiếp cho nó.

Ví dụ các phép gán hợp lệ:

char sz[] = "Kteam"; sz[0] = 'F'; sz[1] = 'r'; sz[2] = 'e'; sz[3] = 'e'; sz[4] = 'E';

Ví dụ các phép gán KHÔNG hợp lệ:

char sz[] = "Kteam"; sz = "FreeE";

Xuất mảng ký tự (C-style strings) với std::cout

Không giống như mảng 1 chiều thông thường cần sử dụng vòng lặp để xuất từng phần tử, mảng ký tự cho phép sử dụng đối tượng std::cout để in toàn bộ ký tự ra màn hình.

Khi in mảng ký tự (C-style strings), đối tượng std::cout sẽ in tất cả ký tự cho đến khi gặp ký tự ‘’ (null).

Ví dụ:

using namespace std; int main() { char szKteam[] = "Kteam"; cout << szKteam << endl; char szFreeEdu[10] = "FreeEdu"; cout << szFreeEdu << endl; szFreeEdu[9] = 'a'; cout << szFreeEdu << endl; return 0; }

Output:

Nhập mảng ký tự (C-style strings) với std::cin

Mảng ký tự (C-style strings) trong C++ cho phép sử dụng đối tượng std::cin để nhập dữ liệu từ bàn phím. Nhưng việc sử dụng trực tiếp đối tượng std::cin sẽ gặp 2 vấn đề.

Vấn đề 1: không nhập được chuỗi kí tự có chứa khoảng trắng

Khi đọc thông tin từ bàn phím, đối tượng std::cin sẽ đọc các ký tự cho đến khi gặp ký tự khoảng trắng ‘ ’, hoặc ký tự enter ‘n’.

Vì vậy, nếu chuỗi của bạn chứa các khoảng trắng, đối tượng std::cin chỉ đọc được từ đầu tiên.

Ví dụ:

using namespace std; int main() { char szFullName[50]; cout << "Nhap ho ten: "; cout << "Ho ten cua ban la: " << szFullName << endl; return 0; }

Output:

Vấn đề 2: tràn mảng khi nhập quá số lượng ký tự so với khai báo

Bạn không thể kiểm soát được các thao tác của người dùng. Trường hợp bạn khai báo 1 mảng ký tự gồm 10 phần tử, nhưng người dùng cố tình (hoặc vô ý) nhập 1 chuỗi nhiều hơn 10 phần tử. Lúc này, vấn đề tràn mảng xảy ra, và chương trình của bạn sẽ gặp lỗi.

Ví dụ:

using namespace std; int main() { char szAddress[10]; cout << "Nhap dia chi: "; cout << "Dia chi cua ban la: " << szAddress << endl; return 0; }

Output:

Giải quyết 2 vấn đề nhập chuỗi bằng phương thức std::cin.getline()

Hàm std::cin.getline() sẽ đọc tất cả các ký tự từ bàn phím (bao gồm khoảng trắng ‘ ‘) cho đến khi gặp ký tự enter ‘n’ (mặc định). Nếu số lượng ký tự nhập vào lớn hơn độ dài truyền vào hàm, mọi ký tự dư thừa sẽ bị loại bỏ.

Ví dụ:

using namespace std; int main() { char szAddress[20]; cout << "Nhap dia chi: "; cin.getline(szAddress, 20); cout << "Dia chi cua ban la: " << szAddress << endl; return 0; }

Output:

Với cách này, bạn sẽ giải quyết được vấn đề nhập khoảng trắng và đảm bảo không bị tràn mảng.

Kết luận

Qua bài học này, bạn đã biết được bản chất và cách sử dụng Mảng ký tự trong C++ (C-style strings).

Trong bài tiếp theo, mình sẽ giới thiệu cho các bạn về CÁC THAO TÁC TRÊN MẢNG KÝ TỰ (C-style strings) trong C++.

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện chúng tôi để nhận được sự hỗ trợ từ cộng đồng.