Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: từ khóa static trong C có ý nghĩa gì?

  1. #1
    Ngày gia nhập
    07 2011
    Bài viết
    2

    Mặc định từ khóa static trong C có ý nghĩa gì?

    mình đang học về C. nhưng không hiểu từ khóa
    Code:
    static
    :(
    help me!
    thanks all!

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    1

    Static là kiểu khai báo sẽ giúp ta giữ giá trị của biến sau mỗi lần gọi hàm.
    Ví dụ: Trong trường hợp :
    chara();
    chara();
    chara();
    }
    /*-----------------*/
    chara()
    {
    char var = 65;
    printf(“\n Character is %c”, var++);
    }
    Kết quả sẽ là :
    A
    A
    A
    .
    Khi ta khai báo:
    {
    ...
    static char var = 65;....
    }
    sau lần gọi hàm thứ 1: var=66. Giá trị này sẽ được giữ cho đến lần gọi thứ 2 và tương tự cho lần gọi 3.
    Kết quả ta sẽ được: A
    B
    C
    Cái này mình mới vừa học qua..Có gì bổ sung cho mọi người học tập thêm nha.

  3. #3
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    356

    Từ khóa static còn có thể dùng trong khai báo hàm. Một hàm static có phạm vi giới hạn trong một file nguồn, hơn là toàn cục.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  4. #4
    Ngày gia nhập
    04 2010
    Bài viết
    1,535

    Trong C, biến nào được khai báo static sẽ có một vị trí vĩnh viễn trong chương trình. Tức là nếu khai báo bên trong một hàm thì lúc thoát ra khỏi hàm, nó vẫn còn đó. Lúc hàm được gọi lần nữa thì nó lại tiếp tục thay vì khởi trị lại.

    Khác với loại biến auto (không static và extern) sau khi thoát ra khỏi hàm thì mất luôn. Lúc hàm được gọi lần nữa thì trị khởi lại từ đầu.

    Khi compiler gặp:

    static int a = 100;

    thì compiler tự động tạo một vùng chứa độc lập cho a và gán trị 100 vào.
    Khi chương trình chạy và hàm được gọi, hàm bỏ qua câu lệnh gán trên và tự động biết dùng địa chỉ vùng chứa để tìm a, không phải gán trị lại (a đã có trị rồi). Vì vậy, nếu trị được thay đổi trong hàm thì a luôn luôn giữ trị mới.

    Khi compiler gặp:

    int a = 100;

    thì compiler biết đây là biến auto. Vùng chứa cho a lúc này phụ thuộc vào hàm. Và a=100 là một lệnh gán mà hàm phải thi hành. Vì vậy, mỗi lần gọi hàm thì a lại được gán trị khởi đầu là 100.

    Từ vùng chứa độc lập và phụ thuộc dùng ở trên chỉ có nghĩa trừu tượng. Độc lập có nghĩa là sự hiện hữu của nó không liên quan gì đến việc hàm có được gọi hay không và hàm đã chạy xong chưa. Phụ thuộc có nghĩa là nó chỉ hiện hữu khi hàm đang chạy và biến mất khi hàm thoát.

    Xin đừng lầm phạm vi (scope) với tầm nhìn thấy (visibility). Biến static có phạm vi toàn cầu nhưng tầm nhìn thấy của chúng chỉ ở bên trong hàm.

    Lưu ý rằng trong C++ từ khóa static ngoài nhiệm vụ trên, còn có ý nghĩa khác nữa.

    tb. sao nhìn cái đề này nghi nó vào sọt rác quá

  5. #5
    Ngày gia nhập
    07 2011
    Bài viết
    2

    thanks all, mình hiểu rồi, cái này cũng là một thắc mắc muh, sao lại phải close nhỉ? VoTichSu? mới tham gia nên mình không rõ lắm

  6. #6
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Mặc định từ khóa static trong C có ý nghĩa gì?

    Trích dẫn Nguyên bản được gửi bởi golden_illusion Xem bài viết
    mình đang học về C. nhưng không hiểu từ khóa
    Code:
    static
    :(
    help me!
    thanks all!
    1 vài cách tác dụng static:

    1. static member data/member function của class:
    ví dụ file Class1.h
    Code:
    class Class1 {
    public:
      static int x;
      static int x_square() {return x*x;}
    };
    trong file Class1.cpp sẽ phải định nghĩa cho biến x:
    Code:
    int Class1::x = 1234;
    để dùng static member của class, sử dụng Class1::x / Class1::x_square()
    static member được dùng gần giống như 1 biến / hàm global.
    Nên hạn chế dùng static class data cũng như global data đối với các kiểu dữ liệu phức tạp (class). Chỉ nên dùng với những kiểu cơ bản (bool, số, char*).

    2. static data trong function
    Cái này các bạn đã nói rồi, các biến static khai báo trong scope của 1 function sẽ chỉ được init 1 lần (lần đầu tiên gọi hàm) và giữ nguyên giá trị cũ trong các lần chạy hàm tiếp theo.

    3. static file-local function
    Ví dụ trong file file1.cpp bạn có định nghĩa 1 hàm:
    Code:
    void abcxyz() {do-something;}
    Mặc định hàm đó sẽ được export, có nghĩa là trong các file khác, để sử dụng hàm này bạn chỉ cần có declaration cho nó:
    Code:
    void abcxyz();
    Điều này nhiều khi không phải là điều bạn muốn. Và nó có thể gây ra phiền phức nếu trong 1 file file2.cpp nào đó bạn cũng có 1 hàm abcxyz() trùng tên => gây lỗi linker warning / error
    Vì vậy nếu bạn chỉ định dùng hàm abcxyz đó nội tại trong file file1.cpp thì nên viết
    Code:
    static void abcxyz() {do-something;}
    ==> scope của hàm đó sẽ được giới hạn chỉ trong file file1.cpp

    Trước mắt chỉ nghĩ ra 3 cách dùng static đó thôi

  7. #7
    Ngày gia nhập
    03 2011
    Nơi ở
    Hà Nội
    Bài viết
    17

    Mình viết theo ý hiểu nha, cũng 1 năm rùi mình hem học C/C++ nữa nên cũng chỉ nhớ mang máng Hi hi

    Ta lam quen tới khái niệm "lớp lưu trữ".

    Cú pháp khai báo hàm:
    <Lớp lưu trữ> <Kiểu trả về> <Tên hàm>(<Kiểu tham số 1><tên tham số 1>, Kiểu tham số 2><tên tham số 2>,... );

    Trong C/C++ có 4 lớp lưu trữ:


    - Auto
    - Extern(al)
    - Static
    - Register

    1. Auto
    Biến tự động thật ra là biến mà chúng ta hay dùng.
    Khi ta viết:
    int a; nó hiểu auto int a;
    -> Tính chất nó thế nào thì ai cũng rõ rùi, hi hi, mình hem cần nói nhiều nữa

    2. Extern
    Extern là cú pháp, tên đầy đủ của nó là External hay còn gọi là biến ngoại.
    Trong C/C++, một chương trình lớn có thể được chia thành các module nhỏ hơn, các module này có thể được biên dịch riêng lẻ và được liên kết lại với nhau. Điều này thực hiện nhằm tăng tốc độ biên dịch các chương trình lớn. Tuy nhiên, khi các module được lên kết , các tập tin phải được chương trình thông báo các biến toàn cục được yêu cầu. Một biến toàn cục chỉ có thể được khai báo 1 lần. Nếu vi phạm, sẽ thông báo lỗi "Duplicate variable name" (Trùng tên biến). Nếu trong các tập tin liên kết nhau có biến trùng thì nó sẽ thông báo lỗi "Duplicate lable" (Nhãn trùng nhau).
    => Người ta sẽ sử dụng lớp lưu trữ extern để giải quyết vấn đề này:
    vd:
    - file 1:
    Code:
    int i, j;
    char a;
    main()
    {
    ....
    }
    file 2
    Code:
    extern int i, j;
    extern char a;
    void abc()
    {
    ....
    }
    file 2 có các biến toàn cục giống file 1, ngoại trừ một điểm là các biến này có từ khóa extern được them vào sự khai báo của chúng. Từ khóa này nói với trình biên dịch là tên và kiểu của biến toàn cục được sử dụng mà không phải tạo lại sự lưu trữ cho chúng. Khi 2 module được liên kết, các tham chiếu đến các biến ngoại được giải quyết.

    Chú ý điểm này: Nếu một biến không được khai báo trong một hàm nào đó, trình biên dịch sẽ so nó với bất kỳ biến toàn cục nào trong tất cả các file. Nếu khớp với biến toàn cục nào, trình biên dịch sẽ xem như 1 biến toàn cục đang được tham chiếu đến.

    3. Static
    Các biến static hay còn gọi là các biến tĩnh là các biến cố định bên trong các hàm hoặc tập tin. Không giống như các biến toàn cục, chúng không được biết đến bên ngoài hàm hoặc tập tin của chúng, nhưng điểm hay ở chỗ, chúng giữ được giá trị giữa các lần gọi. Hay nói cách khác, nếu một hàm kết thúc và sau đó được gọi lại, các biến tĩnh định nghĩa trong hàm đó vẫn giữ được giá trị. Biến tĩnh có sự ưu tiên cáo hơn các biến ngoại.

    VD về biến tĩnh:

    TH1: Không sử dụng biến tĩnh
    Code:
    #include<iostream.h>
    #include<conio.h>
    #include<stdio.h>
    
    void HAM();
    
    main()
    {
        HAM();
        HAM();
        HAM();
        getch();
    }
    
    void HAM()
    {
        char a =  65;
        cout<<a++<<"\n";
    }
    Kết quả:
    A
    A
    A

    TH2: Sử dụng biến tĩnh
    Code:
    #include<iostream.h>
    #include<conio.h>
    #include<stdio.h>
    
    void HAM();
    
    main()
    {
        HAM();
        HAM();
        HAM();
        getch();
    }
    
    void HAM()
    {
        static char a =  65;
        cout<<a++<<"\n";
    }
    Kết quả:
    A
    B
    C

    4. Register
    Phần này mình ko nhớ rõ lắm vì ít dùng. Tạm hiểu, khi ta khai báo nó với lớp lưu trữ là register thì chương trình sẽ kiểm tra xem các thanh ghi trên CPU còn thừa tài nguyên ko, nếu thừa thì nó sẽ lưu giá trị của biến vào thanh ghi mà không lưu vào RAM, tốc độ sẽ nhanh hơn rất nhiều. Nếu chương trình kiểm tra thấy tài nguyên thanh ghi không đủ thì chương trình sẽ hiểu biến này là biến Auto.
    Có thể ăn nửa bữa, ngủ nửa đêm, nhưng không thể đi có một nửa đường chân lý, yêu một nửa trái tim

  8. #8
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,005

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Trong C, biến nào được khai báo static sẽ có một vị trí vĩnh viễn trong chương trình. Tức là nếu khai báo bên trong một hàm thì lúc thoát ra khỏi hàm, nó vẫn còn đó. Lúc hàm được gọi lần nữa thì nó lại tiếp tục thay vì khởi trị lại.

    Khác với loại biến auto (không static và extern) sau khi thoát ra khỏi hàm thì mất luôn. Lúc hàm được gọi lần nữa thì trị khởi lại từ đầu.

    Khi compiler gặp:

    static int a = 100;

    thì compiler tự động tạo một vùng chứa độc lập cho a và gán trị 100 vào.
    Khi chương trình chạy và hàm được gọi, hàm bỏ qua câu lệnh gán trên và tự động biết dùng địa chỉ vùng chứa để tìm a, không phải gán trị lại (a đã có trị rồi). Vì vậy, nếu trị được thay đổi trong hàm thì a luôn luôn giữ trị mới.

    Khi compiler gặp:

    int a = 100;

    thì compiler biết đây là biến auto. Vùng chứa cho a lúc này phụ thuộc vào hàm. Và a=100 là một lệnh gán mà hàm phải thi hành. Vì vậy, mỗi lần gọi hàm thì a lại được gán trị khởi đầu là 100.

    Từ vùng chứa độc lập và phụ thuộc dùng ở trên chỉ có nghĩa trừu tượng. Độc lập có nghĩa là sự hiện hữu của nó không liên quan gì đến việc hàm có được gọi hay không và hàm đã chạy xong chưa. Phụ thuộc có nghĩa là nó chỉ hiện hữu khi hàm đang chạy và biến mất khi hàm thoát.

    Xin đừng lầm phạm vi (scope) với tầm nhìn thấy (visibility). Biến static có phạm vi toàn cầu nhưng tầm nhìn thấy của chúng chỉ ở bên trong hàm.

    Lưu ý rằng trong C++ từ khóa static ngoài nhiệm vụ trên, còn có ý nghĩa khác nữa.

    tb. sao nhìn cái đề này nghi nó vào sọt rác quá
    khá tốt nhưng có nhiều chỗ chưa được chính xác lắm
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  9. #9
    Ngày gia nhập
    07 2012
    Bài viết
    1

    huhu sao em làm mà nó ko đổi ta:(.ko bjk bị gì nữa
    Code:
    #include "iostream"
    #include "stdlib.h"
    using namespace std;
    void FindMax(int a,int b)
    {
    	static int max;
    	if(a>b)max=a;
    	else max=b;
    	cout<<"max is "<<max;
    }
    int main()
    {
    	int a,b;
    	char c;
    	do
    	{
    		cout<<"enter two number :";
    		cin>>a>>b;
    		FindMax(a,b);
    		cout<<",enter more?(Y/N)";
    		fflush(stdin);
    		cin.get(c);
    	}
    	while(c=='y'||c=='Y');
    	system("pause");
    	return 0;
    }
    =>ko thấy nó lưu lại gì hết trơn

  10. #10
    Ngày gia nhập
    04 2010
    Bài viết
    1,535

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    khá tốt nhưng có nhiều chỗ chưa được chính xác lắm
    Được rồi, giải thích lý thuyết không đủ thì thêm thực hành.

    Trên nguyên tắc, một hàm trong C được viết theo dạng reentrant code, có nghĩa là mỗi lần gọi lại và cho đúng tham số thì nó chạy in hệt như lần trước. Một ví dụ điển hình là hàm random, nếu dùng đúng cái hạt giống (seed) thì nó ra in hệt cái chuỗi random - vì vậy người ta phải dủng time để seed nó ra các chuỗi khác nhau.

    Một trong những cách để không reentrant là dùng biến static. Hàm dùng biến static để giữ lại một số trị nào đó cần thiết cho lần chạy kế tiếp. Lần đầu tiên chạy, các biến static sẽ được gán giá trị đầu tiên, sau đó chúng giữ lại các trị mà chúng được gán.

    Dùng biến toàn cục (extern) cũng thực hiện được nhiệm vụ này. Nhưng biến toàn cục không được gói trọn trong hàm, chúng có thể bị gán trị bởi những hàm khác cho nên không bảo đảm được nhiệm vụ "lần chạy thứ n+1 thừa hưởng những kết quả của lần chạy thứ n".

Các đề tài tương tự

  1. Khai báo "Biến" trong lớp với từ khóa static, thì đó có phải là thuộc tính không?
    Gửi bởi phngcngtn trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 20-04-2012, 10:12 PM
  2. public static readonly trong C# có nghĩa là gì?
    Gửi bởi caovietthuong trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 10-07-2010, 11:22 PM
  3. Auto và Static trong lập trình C/C++ có ý nghĩa gì?
    Gửi bởi thienlong1989 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 15-06-2010, 08:40 AM
  4. Lập trình C# | static trong hàm main có ý nghĩa gì?
    Gửi bởi vanan3103 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 18-05-2009, 12:28 AM
  5. Vấn đề xung quanh từ khóa static
    Gửi bởi legenday trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 03-01-2008, 11:25 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn