sách gpt4 ai đã đi

"p = p + (*p)++ * 3 + c;" có dẫn đến hành vi không xác định không?

In lại Tác giả: Space Dog Thời gian cập nhật: 2023-10-29 15:30:00 28 4
mua khóa gpt4 Nike

Có thể trùng lặp:
Hành vi không xác định và các điểm tuần tự

Theo định nghĩa trong tiêu chuẩn, E1 += E2 gần giống với E1 = E1 + E2, ngoại trừ việc E1 chỉ được đánh giá một lần. Vậy thì, ngoài ra, "p += (*p)++ + c"; dẫn tới hành vi không xác định?

Hãy thử đoạn mã sau trong gcc/g++ (4.7/4.4). Có hai kết quả: bxxxxx (g++4.7) hoặc axbxxx (gcc, g++ 4.4). Nếu chúng ta thực hiện (1) thay vì (2) trong mã, chúng ta sẽ chỉ nhận được axbxxx.

#include 

int chính() {
char s[] = "axxxxx";
ký tự *p = s;

printf("s = %s lúc đầu.\n"
"p trỏ tới ký tự thứ %d.\n", s, p - s);
//p = p + (*p)++ * 3 + 2 - 'a' * 3; // (1)
p += (*p)++ * 3 + 2 - 'a' * 3; // (2)
printf("p được di chuyển về phía trước %d bước\n", p - s);
printf("s = %s sau khi thực hiện phép toán.\n", s);
trả về 0;
}

Tôi không thể tìm ra lý do tại sao nó lại gây ra hành vi không xác định và tôi không thể khẳng định rằng đó là lỗi trong gcc.

Đối với kết quả axbxxx, tôi cũng không hiểu tại sao toán hạng hoặc post ++ lại được đánh giá hai lần (một lần để lấy giá trị, sau đó là lưu giá trị). Vì tiêu chuẩn ghi là "1 ... được thêm vào", tôi nghĩ địa chỉ này chỉ nên được đánh giá một lần. Nếu địa chỉ của các toán hạng sau ++ chỉ được đánh giá một lần, hiệu ứng của biểu thức sẽ như nhau bất kể thứ tự thực hiện phép gán.

===Cập nhật===

Sau khi đọc tài liệu được liên kết trong bình luận đầu tiên, tôi nghĩ rằng quy tắc sau đây có thể quan trọng:

"2) Hơn nữa, giá trị trước đó chỉ được truy cập để xác định giá trị sẽ được lưu trữ." .

Vậy, việc truy cập p trong "p = p + (*p)++ * 3 + c" có được coi là một phần của "giá trị a priori" của *p, độc lập với giá trị được lưu trữ trong *p không?

Theo tôi, quy tắc này không bị phá vỡ.

28 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com