2013-09-23 36 views
5

Khi có khoảng cách giữa + +, ý nghĩa của cụm từ "+ + a" là gì. Biểu thức này được đánh giá như thế nào?Ý nghĩa của biểu thức "+ + a" là gì?

int main() 
    { 
     int a = 3; 

     printf("%d %d", + +a, a); 
    } 

và cũng như thế nào là a+++a được đánh giá? Nó chưa được xác định hoặc không xác định hoặc thực hiện được xác định?

Trả lời

4

Khi có khoảng trống ở giữa trong toán tử ++, thì bạn chỉ cần áp dụng toán tử cộng đơn một lần hai lần.

Về khái niệm a+++a, các đặc điểm kỹ thuật C nói rằng khi có một sự nhập nhằng như vậy, nhai càng nhiều càng tốt (các "tham lam lexer" hoặc "nhai tối đa" quy tắc). Vì vậy, a+++a được đánh giá là a++ + a

Theo nguyên tắc đó, một biểu hiện như thế nào, z = y+++++x; sẽ được phân tích như z = y++ ++ +x;, đó là không hợp lệ (kết quả của một bài thặng dư không phải là bản thân incrementable).

+4

Còn được biết đến, hơi euphonically, như quy tắc 'Tối đa Munch'. –

+0

Lưu ý rằng khi có khoảng cách giữa hai ký tự '+', nó không phải là toán tử tăng; nó là hai toán tử '+' riêng biệt. Theo định nghĩa, bạn không thể có một khoảng trống trong toán tử '++'. –

8

Đây là số không có - hai lần vì + a là số không có và được lặp lại.

a+++a được phân tách rõ ràng là a++ + a, nhưng dẫn đến hành vi không xác định khi được thực thi.

Lưu ý rằng nếu mã được đặt a = -3;, giá trị được in sẽ vẫn là -3, hai lần.

+1

Chỉ cần một nitpick, '+' không phải lúc nào cũng là nop, nó cũng có thể buộc chuyển đổi thành loại rộng hơn. –

+0

@ JensGustedt: Có một ngữ cảnh trong đó sự hiện diện của '+' đơn nhất sẽ buộc thay đổi trong đó sự thay đổi sẽ không xảy ra trong trường hợp không có '+' đơn nhất? Off-hand, tôi không thể nghĩ ra. Trong ví dụ 'printf()', nếu 'a' là' char' hoặc 'short', chuyển đổi thành' int' sẽ xuất hiện bất kể '+' có ở đó hay không (vì các quy tắc để xử lý đối số varargs) . Nếu có một nhiệm vụ như 'a = + a;', có thể có một chuyển đổi từ 'char' thành' int' trên RHS, nhưng nhiệm vụ sẽ giảm bớt điều đó trở lại, và điều tương tự sẽ áp dụng cho ' a = a; '. –

1

+a chỉ đối diện với -a.
Trong các từ khác, trong đó -a sẽ có ký hiệu ngược lại là a, +a chỉ cần xác nhận lại dấu dương/âm hiện tại là a.

Sau đó, có một tích cực bên ngoài một lần nữa, vẫn dẫn đến 3.

Phiên bản ngược lại sẽ được:

printf("%d %d",- -a,a); 

nào sẽ là "tiêu cực âm 3" ... đó là một lần nữa +3.

+1

Given: 'a = -3;', 'b = + a;' không giống với 'b = abs (a);'. Trong trường hợp đầu tiên, 'b' là' -3'; trong trường hợp thứ hai ('abs()'), nó là '+ 3'. –

+0

Hmm không bao giờ nghĩ về nó nhưng tôi không nghĩ rằng + a là đối diện của -a vì, + a sẽ luôn luôn dương bất kể giá trị của a, nhưng -a có thể là dương hoặc âm tức là hai neg làm tích cực nhưng hai tích cực cũng tích cực ... chỉ cần sayin. –

+5

Sẽ + luôn là tích cực? Tôi không nghĩ vậy. Mathemathically, + (- 3) là _still_ -3 ... – ppeterka