2013-07-31 46 views
5

Tôi đang bối rối về cách mã này sẽ được thực thi. Giả sử chúng tôi cósự khác biệt giữa * y ++ và ++ * y?

int x=30,*y,*z; 
y=&x; 

sự khác biệt giữa * y ++ và ++ * y là gì? và cũng là kết quả của chương trình này?

#include<stdio.h> 
int main(){ 

    int x=30,*y,*z; 
    y=&x; 
    z=y; 
    *y++=*z++; 
    x++; 
    printf("%d %d %d ",x,y,z); 
    return 0; 
} 
+1

Suy nghĩ về '++ * y' và' * ++ y'. –

+0

Tôi thấy bạn đang xử lý các con trỏ nhưng điều này có thể hữu ích: http://stackoverflow.com/questions/1094872/is-there-a-difference-between-x-and-x-in-java – zztops

+1

Bạn không thể chỉ * chạy * chương trình tìm đầu ra của nó? (Vâng, nếu bạn sửa chữa nó để không có hành vi không xác định đầu tiên ...) –

Trả lời

8

Khái niệm x = *y++ là trong các hiệu ứng tương tự như:

x = *y; 
y = y + 1; 

Và nếu biểu hiện chỉ là *y++; (không phân) sau đó không có gì của nó, nhưng giống như y++;, đó là y bắt đầu trỏ đến vị trí tiếp theo sau tăng.

Thứ hai biểu ++*y nghĩa để tăng giá trị được trỏ bởi y rằng giống như: *y = *y + 1; (con trỏ không tăng lên) Nó sẽ được rõ ràng hơn với câu trả lời cho câu hỏi đầu tiên của bạn:

Giả sử mã của bạn là:

int x = 30, *y; 
int temp; 
y = &x; 

temp = *y++; //this is same as: temp = *y; y = y + 1; 

Đầu tiên *y sẽ được gán cho temp biến; do đó, temp được gán 30, sau đó giá trị của số gia tăng là y và bắt đầu trỏ đến vị trí tiếp theo sau vị trí x (nơi thực sự không có biến).

trường hợp tiếp theo: Giả sử mã của bạn là:

int x = 30, *y; 
int temp; 
y = &x; 

temp = ++*y; //this is same as *y = *y + 1; temp = *y; 

giá trị Trước *y increments 30-31 và sau đó 31 được gán cho temp (lưu ý: x tại là 31).

phần tiếp theo của câu hỏi của bạn (đọc comments):

int x = 30, *y, *z; 

y = &x;  // y ---> x , y points to x 
z = y;  // z ---> x , z points to x 
*y++ = *z++; // *y = *z, y++, z++ , that is 
       // x = x, y++, z++ 
x++;   // increment x to 31 
5

sự khác biệt giữa * y ++ và ++ * y là gì?

Trong trường hợp biểu thức *y++*z++; bởi vì phiên bản postfix ++ được ưu tiên hơn *, trình biên dịch thấy điều này là;

*(y++) = *(z++); 

Trong trường hợp ++*y; trình biên dịch thấy điều này là ++(*p) và trước tiên nó sẽ tăng giá trị của đối tượng mà nó trỏ tới (x trong trường hợp này) và sau đó trả về giá trị tăng dần của nó.

Bảng tóm tắt cho các khả năng khác;

Expression     Meaning 
------------------------------------------------------------------------------------- 
*y++ or *(y++)   Value of expression is *y before increment; increment y latter 
(*y)++     Value of expression is *y before increment; increment *t later 
*++y or *(++y)   Increment y first; value of expression is *y after increment 
++*y or ++(*y)   Increment *y first; value of expression is *y after increment 

EDIT: Như đã chỉ ra bởi Eric Lippert trong bình luận của ông rằng nói: giá trị của biểu thức là *y trước khi tăng, tăng y sau là sai lầm, tôi muốn làm rõ ở đây là những lời tôi sử dụng sausau nhấn mạnh rằng trước hoặc giá trị tiếp theo của *y, tương ứng, sẽ được sử dụng trong các biểu thức.
Lưu ý rằng, tác dụng phụ có thể được sản xuất theo bất kỳ thứ tự nào, tác dụng phụ tạo ra giá trị đầu tiên và giá trị được chỉ định sau hoặc giá trị được giao trước và sau tác dụng phụ. Để biết thêm chi tiết, hãy đọc câu trả lời: - 1, 2 được cung cấp bởi Eric Lippert.

+0

đầu tiên xóa cuộn ngang .. –

+0

bạn có nghĩ '* y ++' == '* (y ++) '**? ** –

+0

Có. Đung vậy. – haccks

1

Tôi tin rằng bạn hiểu những gì toán tử ++ và * có nghĩa là khi được sử dụng riêng. Khi được sử dụng với nhau thì ưu tiên của toán tử sẽ được phát. Trong C++ toán tử ++ có ưu tiên cao hơn toán tử *. Vì vậy, hiệu quả *y++ có nghĩa là *(y++)++y* có nghĩa là (++y)*. Tôi hi vọng cái này giúp được.

+1

Có lỗi trong SO. Tôi đã viết "* (y ++)" và có thể thấy rõ ràng khi tôi chỉnh sửa nhưng nó chỉ hiển thị "(y ++)". –

+0

Không phải là lỗi: đọc: http://stackoverflow.com/editing-help –

+0

Nó không phải là một lỗi. '*' có đặc biệt trong trình soạn thảo. Đọc faq trên đó. Tôi đã chỉnh sửa để làm rõ ... Và chào mừng bạn đến với SO. –

6

sự khác nhau giữa *y++++*y là gì?

Ý nghĩa của một biểu thức trong C được đặc trưng bởi hai điều: những gì giá trị nó tạo ra và những gì tác dụng phụ nó tạo ra.

Hãy xem xét biểu thức đầu tiên.

Tăng hậu tố có mức độ ưu tiên cao hơn so với dự phòng hội nghị, vì vậy đây là *(y++).

Tăng hậu tố tạo ra tác dụng phụ: thay đổi giá trị y để trỏ đến một vị trí khác. Tăng thêm hậu tố cũng tạo ra một giá trị: giá trị mà y có trước khi nó được tăng lên. Toán tử * sau đó là các tham chiếu giá trị để tạo ra một lvalue: đó là, một cái gì đó bạn có thể sử dụng như một biến, hoặc để lưu trữ hoặc để tìm nạp.

Tôi lưu ý rằng tác dụng phụ có thể xảy ra tại bất kỳ thời điểm nào trước hoặc sau cuộc hội thảo. Nếu bạn đã nói

q = *y++ 

thì tác dụng phụ của ++ có thể xảy ra tại bất kỳ thời điểm nào. Đây có thể là:

q = *y; 
y = y + 1; 

hoặc nó có thể được coi là

t = y; 
y = y + 1; 
q = *t; 

Cả hai đều là hoàn toàn hợp pháp. (Ngoại trừ khóa học rằng nếu y chính nó là một biểu hiện với các tác dụng phụ, những tác dụng phụ đó chỉ được tạo ra một lần.)

Làm thế nào về ++*y? Điều đó là đơn giản: *y tạo ra một biến, nội dung của biến được tăng lên và giá trị của biểu thức là giá trị gia tăng. Lưu ý rằng một lần nữa, các tác dụng phụ có thể được sản xuất out-of-trật tự:

q = ++*y 

có thể được xử lý như:

t = *y + 1; 
*y = t; 
q = t; 

hoặc như

t = *y + 1; 
q = t; 
*y = t; 

Hãy nhớ rằng, C không sản xuất rất nhiều hạn chế về thứ tự mà các tác dụng phụ có thể xảy ra, vì vậy hãy cẩn thận.

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