2012-07-02 24 views
5

Vì vậy, tôi biết rằng C++ có ưu tiên điều hành và rằngC/C++ Math Order of Operation

int x = ++i + i++; 

là undefined vì trướC++ và gửi ++ là cùng cấp và do đó không có cách nào để nói cái nào sẽ được tính toán trước. Nhưng những gì tôi đã tự hỏi là nếu

int i = 1/2/3; 

không xác định. Lý do tôi hỏi là vì có nhiều cách để nhìn vào điều đó (1/2)/3 HOẶC 1/(2/3). Tôi đoán rằng đó là hành vi không xác định nhưng tôi muốn xác nhận.

+3

Không, nó không được xác định. Đó là (một chia cho hai) chia cho ba. Đó là một biểu thức toán học thông thường, nói cách khác. –

+0

Tôi nghĩ rằng suy nghĩ của bạn là một chút mơ hồ ở đây về một trong những đầu tiên và đổ máu vào suy nghĩ của bạn về thứ hai. Việc đầu tiên thực sự sôi xuống theo thứ tự đánh giá đối số cho một hàm không xác định. Tức là, nếu bạn nghĩ về nó như là 'toán tử + (++ i, i ++)' thì nó nhảy ngay tại bạn. –

+1

C++ (và hầu hết các ngôn ngữ lập trình khác) có thứ tự ưu tiên được xác định được mượn từ toán học. Bạn không nhìn vào một biểu thức nhiều cách; các phép toán có một hệ thống phân cấp. Tuy nhiên bạn có thể thay đổi thứ tự của một thao tác sử dụng dấu ngoặc đơn (được đặt tốt). –

Trả lời

5

Trong ví dụ của bạn trình biên dịch là miễn phí để đánh giá "1" "2 "và" 3 "theo thứ tự bất kỳ mà nó thích và sau đó áp dụng các đơn vị từ trái sang phải.

Giống như ví dụ i ++ + i ++. Nó có thể đánh giá i ++ theo thứ tự bất kỳ và đó là nơi mà vấn đề nằm.

Không phải là ưu tiên của hàm không được xác định, đó là thứ tự đánh giá các đối số của nó.

17

Nếu bạn nhìn vào C++ operator precedence and associativity, bạn sẽ thấy rằng các nhà điều hành bộ phận được trái sang phải kết hợp, có nghĩa là điều này sẽ được đánh giá là (1/2)/3, vì:

nhà khai thác được trong cùng một ô (có thể có một vài hàng các toán tử được liệt kê trong một ô) được đánh giá với cùng mức ưu tiên, theo hướng đã cho. Ví dụ, biểu thức a = b = c được phân tích cú pháp dưới dạng a = (b = c) và không phải là (a = b) = c do liên kết từ phải sang trái.

5

Đoạn mã đầu tiên là hành vi không xác định vì biến i đang được sửa đổi nhiều lần giữa các điểm trình tự.

Đoạn mã thứ hai là hành vi được xác định và tương đương với:

int i = (1/2)/3; 

như nhà điều hành / đã trái sang phải associativity.

+0

bạn có thể giải thích thêm tại sao đoạn mã đầu tiên là hành vi không xác định? Nó cho đầu ra 10 nếu bạn sử dụng 'i = 4'. Xin lỗi, tôi là một người mới. – akaHuman

+0

@ shrey347, xem http://c-faq.com/expr/seqpoints.html – hmjd

2

Nó được định nghĩa, nó đi từ trái sang phải:

#include <iostream> 

using namespace std; 

int main (int argc, char *argv[]) { 
    int i = 16/2/2/2; 
    cout<<i<<endl; 
    return 0; 
} 

print "2" thay vì 1 hoặc 16.

0

Có thể nói rằng nó không xác định vì bạn đã chọn một int, là tập hợp các số nguyên. Hãy thử một đôi hoặc nổi bao gồm các phân số.