Variables trong C

Mình mới học C theo tài liệu được chia sẻ trong web đến đoạn này thì mình thắc mắc tại sao mình khai báo kiểu này
image
thì tất cả giá trị so1 so2 ketqua đều nhận là 0
nhưng nếu mình khai báo kiểu này
image
thì so1 lại nhận giá trị = 16 trong khi các biến khác vẫn =0

Chỉ có ketqua mới chắc chắn = 0 trong cả 2 code, ở code 1 thì so1 chắc chắn = 0, còn lại giá trị của các biến là hên xui nha.

1 Like

e cx nghĩ thế nhưng sau khi thử lại mấy lần thi giá trị của các biến đều không đổi so1 vẫn là 16 so2 vẫn là 0 và ketqua vẫn là 0. chả lẽ là do tất cả các lần thực hiện thì chương trình đều lấy cùng 1 vị trí trên ram ạ :thinking:. Tại e nghĩ nếu hên xui thì nó phải thay đổi sau mỗi lần chạy chương trình

lấy giá trị của biến chưa khởi tạo là undefined behavior (UB) nha :V

https://en.cppreference.com/w/c/language/behavior#Uninitialized_scalar

UB nghĩa là trình dịch thích biên dịch thành code gì cũng được :V nó in thẳng số 0 ra luôn mà ko cần đọc giá trị của so1 so2 cũng được :V

2 Likes

thì đại loại e cx hiểu như vậy khi mk ko gán giá trị cho biến mà gọi nó ra thì giá trị có thể là bất kì hoặc giá trị của ô địa chỉ nhớ cũ đã có sẵn nhưng e lại thắc mắc là nếu nó là bất kì thì mỗi lần e chạy chương trình thì nó phải ra 1 kết quả khác nhau chứ ạ. Nhưng e thử nhiều lần thì nó chỉ ra đúng 1 bộ 3 giá trị duy nhất nên e đang tò mò liệu có sự quy định giá trị nào ở đây ko :thinking:

ko :V

em thử thảy vô 1 cái hàm rồi gọi hàm đó lại nhiều lần hoặc gọi 2 3 hàm khác trước khi gọi hàm đó thì có lẽ stack sẽ có thay đổi giá trị :V vd thảy vào hàm f rồi gọi g(); h(); f(); nó in ra khác với f(); hoặc g(); f(); chẳng hạn :V

2 Likes

e mới học lập trình C nên chưa biết g(); h(); f() là gì ạ :)) Chắc em sẽ học thêm rồi quay lại hỏi sau ạ. Cảm ơn bác đã trả lời ạ

vậy là nếu muốn vừa khai báo vừa gán giá trị thì phải tách ra từng biến một chứ không được gộp vào như thế ạ?

Đúng vậy, vì đây là C.

2 Likes

Ý của cụ tntxtnt là như thế này chứ không phải cái gì cao siêu cả:

void f() {
    printf("f()");
}

void g() {
    printf("g()");
}

void h() {
    printf("h()");
}

thì 2 code sẽ có kết quả có thể khác nhau:

f();
g();
h();
int s1 = 0, s2, kq = 0;
printf("%d %d", s1, s2);
f();
g();
f();
int s1 = 0, s2, kq = 0;
printf("%d %d", s1, s2);
2 Likes

E đã test thử và nó có chung 1 kết quả ạ (nếu e để là int s1 , s2, kq = 0; do dòng lệnh hôm qua e viết nó ko gán s1 = 0) thì kết quả vẫn là s1=16 s2=0 với cả dòng lệnh anh ghi và dòng lệnh của e🤔
Với cả e nghĩ ít nhất thì nó cx khẳng định được là khi ko gán giá trị cho biến thì biến sẽ ko lấy giá trị có sẵn trong ô nhớ. (hôm nay sau 1 ngày tắt máy e chạy lại chương trình thì kết quả vẫn như thế mà ko có j thay đổi) nếu nó lấy giá trị có sẵn trong ô nhớ thì sau khi tắt máy ram mất dữ liệu thì nó sẽ phải mang 1 giá trị khác chứ nhỉ

nó là UB thì compiler muốn làm gì cũng được :V :V

khi build có optimize O2 nó luôn in ra 0 0 2 vì nó xor edx edx nghĩa là gán register edx = 0, tương tự với register eax nên nó luôn in ra 0 0 2, ko có đọc giá trị nào ở stack hết :V

khi build ko optimize O0 thì nó đọc giá trị trên stack thật :V nên có thể in ra 0 32766 2

build O2 in ra 1 kiểu, build O0 in ra 1 kiểu khác nên đừng suy nghĩ tại sao nó lại ra 1 kết quả hoài mà ko thay đổi :V

à thêm nhiều biến nữa để nó ko chứa nổi tất cả các biến trên registers được thì có thể in ra tùm lum :V

#include <stdio.h>

int main(void) {
    int arr[100];
    int s1, s2, kq = 2;
    printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", s1, s2, kq,
arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8], arr[9], arr[10], arr[11], arr[12], arr[13], arr[14], arr[15], arr[16],
arr[17], arr[18], arr[19], arr[20], arr[21], arr[22], arr[23], arr[24], arr[25], arr[26], arr[36], arr[99], arr[66], arr[30], arr[31], arr[32], arr[33]);
    return 0;
}

là nó bắt đầu in ra số tầm bậy thôi:

0 0 2 0 0 0 0 1 0 61765110 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 576 832 832 832 832 832 0 0 832 832 832
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?