01/10/2018, 14:46

Giá trị khởi tạo của 1 biến kiểu int trong BorlandC++ ver 5.02

Có đoạn code sau, chạy thì phát hiện phần mềm trên mặc định coi x=1 (vì không khởi tạo x). Điều này có hợp lý trong ngôn ngữ C?

#include <stdio.h>
#include <conio.h>
main()
{
   int x;
   x+=8;
   printf("%d", x);
   getch();
}

Cảm ơn quý vị đã đọc & rep.

Aragami1408 viết 16:52 ngày 01/10/2018

code(refactored and formatted):

#include 
#include

int main()
{
      int x;
      x += 8;
      printf("%d", x);
      getch();
}
Nam Hải Vũ viết 16:58 ngày 01/10/2018

Đồng ý là nên dùng int main(); nhưng viết main() thì vẫn chạy được ở BorlandC++ 5 mà; kết quả vẫn vậy.

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

Hi Nam Hải Vũ.
Có. Giá trị biến khi được khởi tạo là ngẫu nhiên nên nó bằng 1 thì cũng không có gì cả.

Florastamine viết 17:03 ngày 01/10/2018

Mình đã thử cài Borland C++ 5.02 và có thể xác nhận là mặc định trình biên dịch sẽ cho giá trị bằng 1.

Điều này hơi lạ vì hầu hết các trình biên dịch khác mà mình thấy đều sẽ cho giá trị bằng 0 hoặc giá trị rác nếu biến không được gán giá trị ngay sau khi khởi tạo. Nên anh/chị có thể giải quyết bằng cách gán giá trị cho biến = 0 ngay khi khởi tạo (cũng là thói quen tốt, thường thì người dùng sẽ mặc định giá trị của x = 0 nhưng nếu = 1 sẽ dễ phát sinh bug)

@Phong_Ky_Vo: Mình cũng bằng 1, có lẽ do compiler behavior.

Nam Hải Vũ viết 16:53 ngày 01/10/2018

Theo mình nghĩ, đối với 1 trình dịch chuẩn, khi khai báo biến & có phép tính thay đổi giá trị của biến (mà không biết giá trị ban đầu của biến là bao nhiêu) thì trình dịch phải báo lỗi mới phải?
Không có trình dịch nào có thể làm như vậy?

rogp10 viết 16:52 ngày 01/10/2018

Chuẩn không bắt buộc thường là warning thôi.

Nam Hải Vũ viết 16:59 ngày 01/10/2018

Có thêm 1 câu hỏi nhỏ này, vì nó là nhỏ nên có lẽ không nên tạo 1 topic mới.
Có sự khác nhau như thế nào trong 2 cách viết sau (cùng 1 mục đích)
(nghĩa là có thể nói rõ, ví dụ như các ô nhớ sẽ thay đổi như thế nào)

    #include <stdio.h>
    #include <conio.h>
    void f(int &x)
    {
    	x+=2;
    }
    main()
    {   int x=1;
        f(x);
        printf("%d", x);
        getch();
    }

void f(int *x)
{
	*x+=2;
}
main()
{
	int x=1;
    f(&x);
}
Pham Van Hai viết 16:55 ngày 01/10/2018

void f(int &x)

Tính năng (Passing by reference) này không có trong ngôn ngữ C. Chỉ có trong C++.
Bạn nên tìm hiểu kỹ và phân biệt C và C++.
C không phải C++ và ngược lại.

Nam Hải Vũ viết 16:47 ngày 01/10/2018

Cách viết f(int &var) vẫn chạy được ở BC++5
Tại sao BC++5 vẫn được dùng để chạy code ngôn ngữ C?

Pham Van Hai viết 16:51 ngày 01/10/2018

Vì bạn đang dùng compiler C++ để biên dịch bằng cách save file có đuôi .cpp.
Bạn save lại file thành .c sẽ thấy lỗi.

Nam Hải Vũ viết 16:56 ngày 01/10/2018

Vẫn chạy được ở BC++5 (khi đã save thành file .c) ^^
Các bác có biết compiler C nào không (các bác cho kèm cả link down)? Google thì nó chỉ luôn ra compiler C++

Dark.Hades viết 16:52 ngày 01/10/2018

Clang hoặc GCC:

https://gcc.gnu.org/install/binaries.html
https://clang.llvm.org/

Bài liên quan
0