01/10/2018, 11:42

1 số câu hỏi ngớ ngẩn C programming -> điên đầu

câu 1. Ai có thể giải thích cho em hiểu trỏ về tiền xử lý không?
code:

#define A 10
printf("%d", A);
#define A 50
printf("%d", A);

kết quả là 1050 em nghĩ nó phải là 5050. Xin mọi người giải thích dùm em.

câu 2. giá trị mặc định của int type
code:

int a;
prinf("%d", a); // khi em thực thi code trên ubuntu thì nó là 0 do gcc mặc định hay là lỗi.

Em đọc trên link: https://stackoverflow.com/questions/4532871/define-integer-int-whats-the-default-value. Thì giá trị là không xác định mong mọi người giải thích giúp em.

câu 3. char<short < int < long < long long(C99)
HĐH 16 bit: sizeof(int) = sizeof(short) = 2
HĐH 32bit, 64 bit: sizeof(long) = sizeof(int) = 4
xử dụng thư viện stdint.h trên OS 16 bit -> sizeof(int32_t) = 2 ? hay là 4 mong mọi người giải thích giúp em.
Đây là bài em test mong mọi người giúp đỡ

明玉 viết 13:56 ngày 01/10/2018

Phần Macro: bạn đã thực nghiệm thì chắc thấy rõ ràng rồi mà, bạn có thể redefine hệt như gán value cho biến số.
Phần 2: tự động zero memory là kiểu của bọn GCC, ko phải compiler nào cũng thế.
Phần 3: tùy thuộc vào compiler và SDK mà bạn sử dụng (thật đấy).

nghia viết 13:43 ngày 01/10/2018

Chào anh MeigyokuThmn!
câu 1: Tiền xử lý lá thực thi trước khi thực thi compile. Vậy thì mới đầu định nghĩa A = 10 sau đó định nghĩa lại A = 50 kết thúc tiền xử lý rồi mình chuyển qua compile thì giá trị A phải là 50 -> xuất ra màn hình phải là 50 chứ sau còn lại 10. Anh có thể giải thích em hiểu rỏ hơn không.
câu 2: vậy là mặc định GCC là 0. Còn giá trị thực trong C là không xác định?
câu 3: Em bó tay lời giải thích của anh. Em không hiểu.

Em thành thật cảm ơn anh (anh comment và kiến thức) nhưng cũng thành thật xin lỗi anh nếu em dùng từ ngữ không phù hợp. Mong anh tha lỗi.

nghia viết 13:57 ngày 01/10/2018

@ltd anh ơi cứu em với em nhức đầu quá rồi! Cảm ơn anh. Chỉ 1 câu thôi C so crazy but so good, cute, funny, … I like it.!

Nguyen Kien viết 13:49 ngày 01/10/2018
  • Câu 1: Bạn có thể gg để tìm hiểu thêm về tiền xử lý trong C: https://en.wikipedia.org/wiki/C_preprocessor
  • Câu 2: Đó là giá trị rác mà bạn khi bạn không khởi tạo giá trị cho một biến thì biến đó sẽ được compiler định sẵn một giá trị. tip: khi khai báo biến nên khởi tạo giá trị luôn cho biến và khai bào biến gần nơi sd để thu hẹp phạm vi hoạt động của biến.
Văn Dương viết 13:53 ngày 01/10/2018

2 cái define thế mà không báo lỗi à ??

明玉 viết 13:51 ngày 01/10/2018

Quá trình tiền xử lý là nó kiểu như tạo ra 1 file source trung gian, với các macro đều đc replace bằng định nghĩa. Cứ từ trên xuống dưới mà replace, nếu bị redefine thì các lần replace sau thay đổi, các lần trước ko sao.

Nếu bạn sử dụng biến toàn cục hoặc biến static thì default value là 0, nhưng biến local thì trc đây mình build trong cygwin dùng gcc toàn bị auto gán 0. Ko biết các ver khác thế nào. Bên visual studio thì ko có vụ này trừ biến pointer thì ở mode debug bị auto gán 0xcccccccc.

Vấn đề thứ 3 thì có hơi rắc rối, c++ ko hề là ngôn ngữ cross platform như các ngôn ngữ khác. Bạn phải làm việc trên sdk (là tập hợp các file như stdio.h, string.h, v.v.) và compiler dành riêng cho một hđh nào đó (cài visual studio là kèm cả sdk rồi). Mấy cái thứ như kích thước int, long ở mỗi nơi nó khác nhau rất nhiều. Tốt nhất bạn kiếm sdk c++ cho 16 bit rồi mò vào file stdint.h xem int32_t được define thế nào.

nghia viết 13:44 ngày 01/10/2018

Có anh!
thông báo:

warning: “A” redefined
#define A 50

nghia viết 13:58 ngày 01/10/2018

Dạ cảm ơn anh! Chúc anh ngủ ngon! Em đi mò đây!

明玉 viết 13:43 ngày 01/10/2018

Quên, phải undef trước rồi mới tiếp tục define chứ nhỉ

nghia viết 13:57 ngày 01/10/2018

Em đọc đề em cũng thắc mắc giống anh undef đâu ?? Hmm C thật là khó.

明玉 viết 13:55 ngày 01/10/2018

Cái bạn ghi chỉ là warning thôi, chắc là ko cần undef, chả mấy khi mình redefine.

nghia viết 13:43 ngày 01/10/2018

Em cũng chưa bao giờ redefine trừ khi đọc tài liệu pregrocessor thì ok làm thử thôi!

Bài liên quan
0