2010-03-03 35 views
8

thể trùng lặp:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)Thứ tự đánh giá của x = x ++ + ++ x; được?

Trong Java trình tự đánh giá được quy định để được từ trái sang phải. Đây có phải là trường hợp cho C và C++ là tốt, hoặc là nó thực hiện phụ thuộc? Tôi nhớ rằng thứ tự đánh giá không được chỉ định cho các đối số hàm, nhưng về các biểu thức con thì sao?

+0

Bản sao: http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-iiiii-etc http://stackoverflow.com/questions/1826414/whats-the-value- của-ii-closed http://stackoverflow.com/questions/1788696/how-the-code-behaves-different-for-java-and-c-compiler – bk1e

+18

lol. Mod mod-đóng câu hỏi riêng của mình: D – Earlz

+3

@ bk1e: Cảm ơn các liên kết. Tôi đã có một cảm giác điều này sẽ được đề cập ở đây trước đây, nhưng nó đã không xuất hiện khi tôi hỏi câu hỏi. Tôi đã tìm ra cách nhanh nhất để tìm bản gốc sẽ là chỉ hỏi. :) –

Trả lời

13

Không xác định đối số nào cho + được đánh giá trước - nhưng điều đó không quan trọng, vì trong C và C++, sửa đổi cùng một đối tượng hai lần mà không có điểm chuỗi can thiệp là hành vi hoàn toàn không xác định.

Ở đây bạn đang sửa đổi xba lần mà không có một điểm chuỗi can thiệp, vì vậy bạn cũng ra khỏi phòng;)


Phần liên quan của tiêu chuẩn C99 là "6,5 Expressions":

2 giữa điểm chuỗi trước và bên cạnh một đối tượng có trách nhiệm giá trị được lưu trữ của nó biến đổi tối đa một lần bởi việc đánh giá một n biểu thức. Ngoài ra, giá trị trước đó sẽ là chỉ đọc để xác định giá trị là được lưu trữ.

3 Các nhóm các nhà khai thác và toán hạng được chỉ định bởi cú pháp . Trừ khi có quy định sau (đối với chức năng gọi(), & &, ||,:, và dấu phẩy khai thác), thứ tự của đánh giá subexpressions và thứ tự mà tác dụng phụ xảy ra đều không xác định .


Có thể viết mã quy phạm pháp luật thể hiện thứ tự không xác định thẩm định - ví dụ:

#include <stdio.h> 

int foo(void) 
{ 
    puts("foo"); 
    return 1; 
} 

int bar(void) 
{ 
    puts("bar"); 
    return 2; 
} 

int main() 
{ 
    int x; 

    x = foo() + bar(); 
    putchar('\n'); 

    return x; 
} 

(Đó là không xác định cho dù bạn nhận được kết quả của foobar hoặc barfoo).

+0

Cảm ơn bạn đã trả lời nhanh. –

2

Chuẩn C không đảm bảo rằng sau tăng sẽ thực sự "xảy ra" sau khi tăng trước. Vì vậy, đó là hành vi không xác định.

1

Đó không phải là tuyên bố C hợp lệ, do đó không có ý nghĩa gì khi nói về thứ tự đánh giá.

+1

Ý của bạn là "hợp lệ"? Nó biên dịch thành công trong gcc và g ++. –

+4

Có hay không tệp được biên dịch thành công bởi gcc không liên quan đến việc tệp có chứa các câu lệnh C hợp lệ hay không. Chuẩn C xác định cái gì là hợp lệ C, không phải là một trình biên dịch. –

+4

Câu lệnh này có hiệu lực về cú pháp, mặc dù ngữ nghĩa không chính xác vì nó gây ra hành vi không xác định. – qrdl

3

C++ 03 Chuẩn 5.4

Trừ khi có ghi chú, thứ tự của đánh giá của toán hạng của nhà khai thác và subexpressions của biểu cá nhân cá nhân, và thứ tự trong đó tác dụng phụ xảy ra, là unspecified.53) Giữa trước và điểm tiếp theo là một đối tượng vô hướng phải có giá trị được lưu trữ được sửa đổi nhiều nhất một lần bằng cách đánh giá biểu thức . Ngoài ra, giá trị trước đó sẽ là chỉ truy cập để xác định giá trị để được lưu trữ. Các yêu cầu của đoạn này phải được đáp ứng cho mỗi thứ tự cho phép của các biểu thức phụ của một biểu thức đầy đủ; nếu không hành vi không xác định.

... do đó, không xác định và thực hiện phụ thuộc.

Các vấn đề liên quan