Cách làm cho các vòng lặp for trong Java tăng theo số gia khác 1


82

Nếu bạn có vòng lặp for như thế này:

for(j = 0; j<=90; j++){}

Nó hoạt động tốt. Nhưng khi bạn có vòng lặp for như thế này:

for(j = 0; j<=90; j+3){}

nó không hoạt động. Ai đó có thể vui lòng giải thích điều này cho tôi?


17
+1 để tự mình thử điều gì đó trước khi hỏi ở đây.
Falmarri

1
Tác dụng phụ của j++là? Tác dụng phụ của j+3là?

Câu trả lời:


119

Đó là bởi vì j+3không thay đổi giá trị của j. Bạn cần thay thế giá trị đó bằng j = j + 3hoặc j += 3sao cho giá trị của jtăng lên 3:

for (j = 0; j <= 90; j += 3) { }

2
Lần lượt ông có thể int j=0; for(;j<=90;){... j+=3;}nhưng đó là hiển nhiên;)
jcolebrand

6
@drachenstern Nói cách khác, một vòng lặp trong khi.
dkarp

@dkarp ~ Thật vậy, nhưng nhìn thấy cách hầu hết mọi người không nghĩ về cú pháp đó, tôi nghĩ tôi sẽ chỉ ra nó. Đặc biệt là vì OP rõ ràng đang học Java và lập trình khi còn nhỏ (hãy kiểm tra nguồn cấp dữ liệu và blog được liên kết). Tôi ước gì mình đã có SO ở tuổi đó.
jcolebrand

44

Vì không ai khác đã thực sự giải quyết, Could someone please explain this to me?tôi tin rằng tôi sẽ:

j++ là viết tắt, nó không phải là một hoạt động thực tế (ok nó thực sự là, nhưng hãy nhớ với tôi để giải thích)

j++thực sự bằng với hoạt động j = j + 1;ngoại trừ nó không phải là một macro hoặc một cái gì đó thay thế nội tuyến. Có rất nhiều cuộc thảo luận ở đây về hoạt động của i+++++ivà điều đó có nghĩa là gì (bởi vì nó có thể được hiểu là i++ + ++iHOẶC(i++)++ + i

Điều này đưa chúng ta đến: i++so với ++i. Chúng được gọi là toán tử post-incrementand pre-increment. Bạn có đoán được tại sao chúng được đặt tên như vậy không? Phần quan trọng là cách chúng được sử dụng trong các bài tập. Ví dụ, bạn có thể làm: j=i++;hoặc j=++i;Bây giờ chúng tôi sẽ làm một thử nghiệm ví dụ:

// declare them all with the same value, for clarity and debug flow purposes ;)
int i = 0;
int j = 0;
int k = 0;

// yes we could have already set the value to 5 before, but I chose not to.
i = 5;

j = i++;
k = ++i;

print(i, j, k); 
//pretend this command prints them out nicely 
//to the console screen or something, it's an example

Giá trị của i, j và k là gì?

Tôi sẽ cho bạn câu trả lời và để bạn giải quyết vấn đề đó;)

i = 7, j = 5, k = 7;Đó là sức mạnh của các toán tử gia tăng trước và sau, và những nguy cơ khi sử dụng chúng sai cách. Nhưng đây là cách thay thế để viết cùng một thứ tự hoạt động:

// declare them all with the same value, for clarity and debug flow purposes ;)
int i = 0;
int j = 0;
int k = 0;

// yes we could have already set the value to 5 before, but I chose not to.
i = 5;

j = i;
i = i + 1; //post-increment

i = i + 1; //pre-increment
k = i;

print(i, j, k); 
//pretend this command prints them out nicely 
//to the console screen or something, it's an example

Ok, bây giờ tôi đã chỉ cho bạn cách ++hoạt động của toán tử, hãy kiểm tra lý do tại sao nó không hoạt động j+3... Hãy nhớ cách tôi gọi nó là "tốc ký" trước đó? Đó chỉ là nó, hãy xem ví dụ thứ hai, bởi vì đó là hiệu quả những gì trình biên dịch làm trước khi sử dụng lệnh (nó phức tạp hơn thế, nhưng đó không phải là giải thích đầu tiên). Vì vậy, bạn sẽ thấy rằng "tốc ký mở rộng" có i =i + 1là tất cả những gì yêu cầu của bạn có.

Điều này trở lại với toán học. Một hàm được định nghĩa ở đâu f(x) = mx + bhoặc một phương trình y = mx + bđể chúng ta gọi là gì mx + b... nó chắc chắn không phải là một hàm hay phương trình. Nhiều nhất nó là một biểu thức. Đó là tất cả j+3, một biểu thức. Một biểu thức không có phép gán chúng ta không tốt, nhưng nó chiếm thời gian của CPU (giả sử trình biên dịch không tối ưu hóa nó).


Tôi hy vọng điều đó sẽ làm sáng tỏ mọi thứ cho bạn và cho bạn một khoảng thời gian để đặt những câu hỏi mới. Chúc mừng!


9

Trong ví dụ của bạn, j+=3tăng 3.

(Không có gì khác để nói ở đây, nếu nó liên quan đến cú pháp, tôi khuyên bạn nên sử dụng Google trước tiên, nhưng tôi là người mới ở đây nên tôi có thể sai.)


3
Bạn nói đúng, nhưng câu hỏi ban đầu có j+3không thực sự tăng j. OP nên sử dụng j += 3.
Greg Hewgill

8
for(j = 0; j<=90; j = j+3)
{

}

j+3sẽ không gán giá trị mới cho j, add j=j+3sẽ gán giá trị mới cho j và vòng lặp sẽ di chuyển lên 3.

j++giống như nói j = j+1, vì vậy trong trường hợp đó, bạn chỉ định giá trị mới cho j giống như ở trên.



4

Nó phải như thế này

for(int j = 0; j<=90; j += 3) 

nhưng hãy coi chừng

for(int j = 0; j<=90; j =+ 3) 

hoặc là

for(int j = 0; j<=90; j = j + 3)

2

Đơn giản chỉ cần thử cái này

for(int i=0; i<5; i=i+2){//value increased by 2
//body
}

HOẶC LÀ

for(int i=0; i<5; i+=2){//value increased by 2
//body
}

1

Bạn cũng có thể viết mã dưới dạng

for(int i=0;i<n;i++)
{
      //statements;
      i=i+2;//cause you want to increment i by 3 
}

1
for(j = 0; j<=90; j++){}

j ++ có nghĩa là j = j + 1, giá trị j đã là 0 bây giờ chúng ta đang thêm 1 nên bây giờ tổng giá trị của j + 1 trở thành 1, cuối cùng chúng ta đang ghi đè giá trị j (0) bằng giá trị tổng (1) vì vậy ở đây chúng ta ghi đè giá trị j bằng j + 1. Vì vậy mỗi lần lặp giá trị j sẽ được tăng thêm 1.

for(j = 0; j<=90; j+3){}

Ở đây j + 3 có nghĩa là giá trị j đã là 0 bây giờ chúng ta đang thêm 3 nên bây giờ tổng giá trị của j + 3 trở thành 3 nhưng chúng ta không ghi đè giá trị j hiện có. Vì vậy, JVM yêu cầu lập trình viên, bạn đang tính toán giá trị mới nhưng bạn đang gán giá trị đó cho một biến (tức là j). Đó là lý do tại sao chúng tôi nhận được lỗi thời gian biên dịch "AssignmentOperator không hợp lệ".

Nếu chúng ta muốn tăng giá trị j lên 3 thì chúng ta có thể sử dụng bất kỳ cách nào sau đây.

 for (int j=0; j<=90; j+=3)  --> here each iteration j value will be incremented by 3.
 for (int j=0; j<=90; j=j+3) --> here each iteration j value will be incremented by 3.  

0

Phần "gia số" của câu lệnh lặp phải thay đổi giá trị của biến chỉ số để có bất kỳ tác dụng nào. Dạng viết tay của "++ j" là "j = j + 1". Vì vậy, như các câu trả lời khác đã nói, dạng đúng của gia số của bạn là "j = j + 3", không có tốc độ ngắn như tăng dần một. "j + 3", như bạn đã biết, không thực sự thay đổi j; đó là một biểu thức mà đánh giá không có tác dụng.


0

Nếu bạn có vòng lặp for như thế này:

for(j = 0; j<=90; j++){}

Trong vòng lặp này, bạn đang sử dụng tốc ký do ngôn ngữ java cung cấp, có nghĩa là toán tử postfix (use-then-change) tương đương với j = j + 1, vì vậy giá trị đã thay đổi được khởi tạo và sử dụng cho thao tác tiếp theo.

for(j = 0; j<=90; j+3){}

Trong vòng lặp này, bạn chỉ tăng giá trị của mình lên 3 nhưng không khởi tạo nó trở lại biến j, vì vậy giá trị của j vẫn thay đổi.



0
for (let i = 0; i <= value; i+=n) { // increments by n
/*code statement*/
}

định dạng này phù hợp với tôi khi tăng chỉ số lên n

for (let i = 0; i <= value; i+=4) { // increments by 4
/*code statement*/
}

nếu n = 4 nó sẽ tăng lên 4

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.