01/10/2018, 08:20

Biến trong C++ có tự động reset về gtri ban đầu trong khi đang trong vòng lặp không?

Mình VD có đoạn code này :

#include "stdafx.h"
#include <iostream>

int main()
{
 int i = 1
    while ( i < 1000 ) 
	{ int a = 1;
          i++;
          a++;
         {
return 0;

}

Câu hỏi ở đây là, khi chạy hết vòng lặp rồi đảo lại gặp câu lệnh int a = 1, vậy thì giá trị a có trở lại 1 không hay sẽ là 2 ?

Ngo Hoang Khang viết 10:32 ngày 01/10/2018

thế rốt cuộc là cho dù a có bị thay đổi ntn đi nữa thì khi tới chỗ đó nó sẽ là 1 hả ?

rogp10 viết 10:31 ngày 01/10/2018
Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.

Ngo Hoang Khang viết 10:36 ngày 01/10/2018

ra kết luận cuối cùng luôn đi bạn có bị chuyển thành 2 ko

Ngo Hoang Khang viết 10:25 ngày 01/10/2018

đang ko hiểu mà gặp bác nữa

Trần Hoàn viết 10:36 ngày 01/10/2018

Có định chạy thử code không hay là copy đâu về mà hỏi buồn cười thế

Ngo Hoang Khang viết 10:24 ngày 01/10/2018

do bí bài tập nên mình có xem vài bạn làm , thì thấy có câu lệnh đó nên muốn hỏi thôi, cò chạy thì có chạy mà nó ra cái j ko nên mới hỏi chứ tưởng rãnh lắm à -_-

Tao Không Ngu. viết 10:32 ngày 01/10/2018

Xin lỗi Ngo Hoang Khang.
Mình đã làm phiền bạn.

Trần Hoàn viết 10:32 ngày 01/10/2018

Haizzzz
[spoiler]Mình thấy bạn lên đây hỏi bài tập hơi nhiều à :))[/spoiler]
Đoạn đó không chạy, bạn thấy đấy 3 dấu “{” mà chỉ có 1 dấu “}”.

Nếu nói chính xác, “a” sẽ không trở lại giá trị 1.

Bạn hiểu khái niệm biến toàn cục và biến cục bộ chứ? Trong ví dụ bạn đưa, “a” được KHAI BÁO đồng thời KHỞI TẠO bên trong vòng lặp “while”, đóng vai trò của một biến cục bộ và không thể truy cập từ phía ngoài vòng lặp, khác với “i” được KHAI BÁO bên ngoài vòng lặp nên có thể truy cập ở ngoài.

=> Mỗi khi vòng lặp chạy thêm 1 lần, một biến “a” MỚI được KHAI BÁO, và được KHỞI TẠO với một ô nhớ nào đó với giá trị (int) 1. Mỗi lần KHỞI TẠO, “a” sẽ được gán vào một ô nhớ mới, trong khi ô nhớ cũ không được giải phóng. Vì bạn KHAI BÁO “a” trong vòng lặp, thế nên khi vòng lặp kết thúc 1 vòng, compiler sẽ hoàn toàn quên luôn biến cục bộ đó, không còn một biến nào tên là “a”. Bước vào vòng lặp mới thì 1 biến cục bộ mới được sinh ra, và do câu lệnh int a = 1, một biến mới được KHỞI TẠO, và đặt tên là “a”. Vòng lặp sẽ tiếp tục đến khi không còn thoả mãn điều kiện (i ≥ 1000).

Mình không thạo về con trỏ nên mình cũng không biết cách để lấy giá trị của ô nhớ chưa bị free. Nhưng mình nghĩ là nếu chưa bị free thì những ô nhớ đã từng dùng để khởi tạo “a” sẽ còn lưu giá trị (int) 2.

Phan Bá Hải viết 10:30 ngày 01/10/2018

Hãy copy đoạn này và chạy (có thể trên máy tính của bạn hoặc trên các trang online compiler như Tutorialpoint Codeground https://www.tutorialspoint.com/compile_cpp_online.php

#include <iostream>
using namespace std;
int main()
{
 int i = 1;
    while ( i < 1000 ) 
	{ int a = 1;
          i++;
          a++;
          cout << "a = " << a << endl;
    }
cout << "i = " << i << endl;
return 0;
}

a luôn luôn bằng 2
Nói đơn giản, vì a khai báo trong vòng lặp while nên sau khi a++ (lúc này a = 2) , nó quay lại vòng while và kiểm tra điều kiện i < 1000 không. Nếu đúng nó sẽ khai báo lại int a = 1;
[spoiler]Bạn viết code vừa sai tè le, vừa không có lấy 1 câu lệnh in a ra màn hình nên nó không chạy là đúng rồi. Lại còn gây khó dễ cho người khác nữa. Mình bó tay toàn tập với bạn[/spoiler]

Thược Nguyễn viết 10:28 ngày 01/10/2018

bạn nên tìm hiểu phạm vi sử dụng biến thì sẽ biết giá trị của ‘a’ là bao nhiêu luôn mà. a Đạt có cả clip nói về phạm vi sử dụng biến đó bạn

Hoang Kien viết 10:29 ngày 01/10/2018

, thì thấy có câu lệnh đó nên muốn hỏi thôi, cò chạy thì có chạy mà nó ra cái j ko nên mới hỏi chứ tưởng rãnh

Theo mình thì
Biến a bị thay đổi giá trị từ 1 lên 2, và được gán lại giá trị bằng 1 trong 999 lần. Sau khi chạy xong vong while thì i = 1000, còn biến a sẽ bị hủy. Bạn có thể xem bài tầm vực của biến trong video của @ltd để hiểu hơn.

Ngo Hoang Khang viết 10:33 ngày 01/10/2018

cảm ơn mọi người mình nhớ zụ gắn lại gtri của biến rồi :v

... viết 10:33 ngày 01/10/2018

This topic was automatically closed after 24 hours. New replies are no longer allowed.

Bài liên quan
0