Tôi lấy tính từ "kỹ thuật" để chỉ hành vi / quirks ngôn ngữ và tác dụng phụ của trình biên dịch, chẳng hạn như hiệu suất của mã được tạo.
Cuối cùng, câu trả lời là: không (*). (*) Là "vui lòng tham khảo hướng dẫn sử dụng bộ xử lý của bạn". Nếu bạn đang làm việc với một số hệ thống RISC hoặc FPGA trường hợp cạnh, bạn có thể cần kiểm tra xem hướng dẫn nào được tạo và giá của chúng. Nhưng nếu bạn đang sử dụng khá nhiều bất kỳ kiến trúc hiện đại thông thường, thì không có sự khác biệt mức xử lý đáng kể về chi phí giữa lt
, eq
, ne
và gt
.
Nếu bạn đang sử dụng một trường hợp cạnh bạn có thể thấy rằng !=
đòi hỏi ba hoạt động ( cmp
, not
, beq
) vs hai ( cmp
, blt xtr myo
). Một lần nữa, RTM trong trường hợp đó.
Đối với hầu hết các phần, lý do là phòng thủ / cứng, đặc biệt là khi làm việc với con trỏ hoặc vòng lặp phức tạp. Xem xét
// highly contrived example
size_t count_chars(char c, const char* str, size_t len) {
size_t count = 0;
bool quoted = false;
const char* p = str;
while (p != str + len) {
if (*p == '"') {
quote = !quote;
++p;
}
if (*(p++) == c && !quoted)
++count;
}
return count;
}
Một ví dụ ít gây tranh cãi sẽ là nơi bạn đang sử dụng các giá trị trả về để thực hiện gia số, chấp nhận dữ liệu từ người dùng:
#include <iostream>
int main() {
size_t len = 5, step;
for (size_t i = 0; i != len; ) {
std::cout << "i = " << i << ", step? " << std::flush;
std::cin >> step;
i += step; // here for emphasis, it could go in the for(;;)
}
}
Hãy thử điều này và nhập các giá trị 1, 2, 10, 999.
Bạn có thể ngăn chặn điều này:
#include <iostream>
int main() {
size_t len = 5, step;
for (size_t i = 0; i != len; ) {
std::cout << "i = " << i << ", step? " << std::flush;
std::cin >> step;
if (step + i > len)
std::cout << "too much.\n";
else
i += step;
}
}
Nhưng những gì bạn có thể muốn là
#include <iostream>
int main() {
size_t len = 5, step;
for (size_t i = 0; i < len; ) {
std::cout << "i = " << i << ", step? " << std::flush;
std::cin >> step;
i += step;
}
}
Ngoài ra còn có một điều gì đó thiên về quy ước <
, bởi vì việc đặt hàng trong các thùng chứa tiêu chuẩn thường dựa vào operator<
, ví dụ băm trong một số container STL xác định sự bằng nhau bằng cách nói
if (lhs < rhs) // T.operator <
lessthan
else if (rhs < lhs) // T.operator < again
greaterthan
else
equal
Nếu lhs
và rhs
là một lớp do người dùng định nghĩa viết mã này là
if (lhs < rhs) // requires T.operator<
lessthan
else if (lhs > rhs) // requires T.operator>
greaterthan
else
equal
Người thực hiện phải cung cấp hai chức năng so sánh. Vì vậy, <
đã trở thành nhà điều hành ưa thích.
i++
thànhi+=2
(ví dụ), nó sẽ chạy trong một thời gian rất dài (hoặc có thể là mãi mãi). Bây giờ, vì bạn thường sử dụng<
cho những trường hợp bạn tăng số vòng lặp lên hơn 1, nên bạn cũng có thể sử dụng<
cho trường hợp bạn tăng nó lên 1 (để thống nhất).