2011-12-05 31 views
5

Tôi có tuyên bố này:Phương thức ưu tiên trong C - Trả về một giá trị gia tăng

return *local_stack_var2++ + 42;

Đây sẽ là các bước thích hợp khi phá vỡ nó xuống:
1. dereference local_stack_var2
2. Thêm 42 đến dereferenced local_stack_var2 (chức năng thực sự sẽ trả về giá trị này)
3. Trước khi chức năng kết thúc, nó sẽ kích hoạt tăng sau, tăng giá trị của đối tượng được trỏ tới bởi local_stack_var2

Vì vậy, ở định dạng mã, nó sẽ trông giống như thế này?

int temp = *local_stack_var2 //step 1; 
int returnValue = temp + 42; //step 2, compiler will return THIS value  
*local_stack_var2 = *local_stack_var2 + 1; //step 3 
return returnValue; 

Cảm ơn!

+0

Precedence ưu tiên và ưu tiên ... –

Trả lời

8

Đóng, nhưng ++ (postincrement) có mức ưu tiên cao hơn so với số * đơn nhất, vì vậy điều này xảy ra trước tiên. Trình tự hoạt động sẽ là:

  1. bài viết tăng local_stack_var2 để nó được tăng lên bởi một nhưng sự biểu hiện đánh giá với giá trị ban đầu, không phải là giá trị tăng lên
  2. dereference rằng giá trị ban đầu
  3. thêm 42 với những gì được thu thập bởi dereferencing giá trị ban đầu nói trên
  4. trở lại mà đánh giá

Vì vậy, trong mã, nó sẽ là như (không chính xác, nhưng gần)

int* temp = local_stack_var2; 
local_stack_var2 = local_stack_var2 + 1; 
int retval = *temp; 
reval = retval + 42; 
return retval; 
+0

Các postincrement không nhất thiết xảy ra * đầu tiên *. '+ +' có độ ưu tiên cao hơn '*' có nghĩa là nó là 'local_stack_var2' được tăng lên, không phải' * local_stack_var2' - điều khiển ưu tiên * những gì * được tăng lên, không * khi * nó được tăng lên. Sự gia tăng thực tế có thể xảy ra bất cứ lúc nào cho đến khi hàm trả về. – caf

+0

@caf có, đó là những gì tôi đã nghĩ đến khi tôi đặt "like" in nghiêng và thêm "(không chính xác, nhưng đóng)". Về mặt kỹ thuật, không có cách nào bạn viết nó sẽ chính xác vì điều đó nhưng tôi không nghĩ nó đủ quan trọng để quan tâm đến OP với nó. –

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