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?
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?
Câu trả lời:
Đó là bởi vì j+3
không thay đổi giá trị của j
. Bạn cần thay thế giá trị đó bằng j = j + 3
hoặc j += 3
sao cho giá trị của j
tăng lên 3:
for (j = 0; j <= 90; j += 3) { }
int j=0; for(;j<=90;){... j+=3;}
nhưng đó là hiển nhiên;)
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+++++i
và điều đó có nghĩa là gì (bởi vì nó có thể được hiểu là i++ + ++i
HOẶ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-increment
and 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 =
VÀ i + 1
là 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 + b
hoặ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!
Trong ví dụ của bạn, j+=3
tă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.)
j+3
mà không thực sự tăng j
. OP nên sử dụng j += 3
.
for(j = 0; j<=90; j = j+3)
{
}
j+3
sẽ không gán giá trị mới cho j, add j=j+3
sẽ 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.
Thay đổi
for(j = 0; j<=90; j+3)
đến
for(j = 0; j<=90; j=j+3)
Đơ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
}
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
}
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.
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.
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.
Nó chỉ là một lỗi cú pháp. Bạn chỉ cần thay thế j+3
bằng j=j+3
hoặc j+=3
.