Đoạn code dưới đây cho thấy sự khác biệt này:Tính ưu tiên của toán tử trong C++ có khác nhau đối với con trỏ và vòng lặp không?
#include <iostream>
#include <string>
int main()
{
char s[] = "ABCD";
std::string str(s);
char *p = s;
while(*p) {
*p++ = tolower(*p); // <-- incr after assignment
}
std::cout << s << std::endl;
std::string::iterator it = str.begin(), end = str.end();
while(it != end) {
*it++ = tolower(*it); // <-- incr before assignment ?
}
std::cout << str << std::endl;
return 0;
}
nó tạo ra:
abcd
bcd
nếu chúng ta tách hoạt động phân công và điều hành increment:
while(it != end) {
*it = tolower(*it); // <-- incr before assignment ?
it++;
}
đầu ra sẽ được như mong đợi.
Có gì sai với mã gốc?
$ g++ --version
g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
Tệ hơn hành vi không xác định, có hành vi không xác định trong biểu thức gốc. Có thể sắp xếp các biểu thức con khi 'it ++' được đánh giá (tức là ghi vào' nó') trước khi 'nó' được đọc trong việc đánh giá tham số cho' tolower' mà không có điểm chuỗi xen kẽ. Điều này có thể xảy ra cho dù toán tử gán có phải là một cuộc gọi hàm hay không. Dù bằng cách nào 5 [expr], đoạn 8 xác nhận rằng đây là hành vi không xác định. –