2013-07-30 34 views
6

Tôi đã là nguồn mã sau trong C:Toán tử giảm dần hoạt động như thế nào trong một câu lệnh while?

#include<stdio.h> 

void main() 
{ 
    int i=0, x=3; 
    while((x---1)) 
    { 
     i++; 
    } 
    printf("%d", i); 
} 

như thế nào trong khi tuyên bố công việc này và tại sao nó in 2 thay vì 1?

+6

Tôi vẫn thích toán tử '->' tốt hơn: 'while (x -> 0) {...}' – nneonneo

+2

@nneonneo Đề xuất "x chuyển thành số không" :) Các nhà toán học và tác giả đệ trình IOCCC phải yêu thích . –

+1

Tôi đã sử dụng nó trong mã thử nghiệm đồ chơi bởi vì nó dễ dàng hơn rất nhiều so với nhập tương đương cho vòng lặp. Nhưng, những người bảo trì có lẽ sẽ giết tôi nếu tôi cố gắng nộp nó cho thật :) – nneonneo

Trả lời

10

x---1 thực sự chỉ là x-- - 1 mang lại giá trị x - 1 trước khi giảm x.

Cho rằng x có giá trị ban đầu là 3, vòng lặp chạy 2 lần (một lần với x = 3, một lần với x = 2, thì lần sau x là 1, vì vậy x - 1 là 0 và vòng lặp không chạy nữa).

Vì vậy, i bắt đầu từ 0 và nó tăng lên gấp đôi, vì vậy nó kết thúc lên được 2.

+1

Cảm ơn bạn, bây giờ tôi nhận ra rằng x chỉ bị giảm đi bởi câu lệnh x--. Tôi không biết tại sao tôi nghĩ rằng nó đã được giảm đi hai lần: một lần bởi x-1 và sau đó là tuyên bố x--. Nhưng vì nó không phải là x = x-1, nó không thay đổi giá trị của nó bằng cái này. Đã cho tôi một thời gian để có được nó mặc dù :) –

5

(x---1) == (x-- -1)

vì trình biên dịch thử để chọn thẻ lớn đầu tiên, Vì vậy --- hiểu là -- & -

Biểu x-- - 1 nghĩa đầu tiên 1trừ từ giá trị hiện tại của x do - trừ hoạt động. Sau đó, x giá trị được giảm dần bởi 1 do toán tử giảm hậu tố --.

Ví dụ, ở trước đầu tiên lặp x = 3, như vậy trong khi điều kiện là 2 (có nghĩa là 3 - 1) sau đó x giảm đi, và trước khi phiên bản kế tiếp x = 2.

x = 3, i =0;

  • 1-lặp:while(2), và trong vòng lặp i trở thành 1

x = 2, i = 1;

  • 2-lặp:while(1), và trong vòng lặp i trở thành 2

x = 1, i = 2;

  • Bây giờ, x - 1 = 0 cung cấp cho while(0) và vòng lặp phá vỡ và i không tăng.

Vì vậy, sau vòng đầu ra i: 2

lưu ý thêm một điểm: i không tăng như phá vỡ vòng lặp vì i++ trong khi khối {}, nhưng x giảm đi để 0. Sau vòng lặp nếu bạn printf x thì đầu ra sẽ là 0.

2

while((x---1)) tương đương với while((x-- -1 != 0)), do đó cũng giống như viết while(x-- != 1). Kể từ khi giá trị của x-- là giá trị của xtrước sự sụt lần, điều này cũng giống như

while(x != 1) { 
    x--; 
    ... 
} 

chạy hai lần nếu x bắt đầu từ 3.

3

Vì vậy, trong khi lẽ ý nghĩa hơn nếu bạn nhìn vào nó với một số không gian khác:

while((x-- - 1)) 

Nó đang sử dụng một phần giảm sau đó x được sửa đổi sau khi trả lại giá trị hiện tại của nó để nó thực sự tương đương với điều này :

while((x - 1)) 

và vòng lặp sẽ chạy cho đến khi biểu thức là false hoặc trong trường hợp này 0 tương đương với false. Vì vậy, chạy đi như thế này:

x x - 1 i 
============= 
3  2  1 x - 1 not 0 so increment i 
2  1  2 x - 1 not 0 so increment i 
1  0  2 Loop exits here and does not increment i again 

Tại thời điểm này thoát ra và bạn nhấn printf.

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