Bạn nghĩ bạn hiểu rõ về C? Hãy làm thử bài test này để kiểm tra

Bạn đã từng dùng C, và tin rằng bạn hiểu nó? Hãy làm thử bài test này để kiểm tra hiểu biết của mình về C nhé.
Với mỗi câu hỏi, hãy chọn đáp án tương ứng với kết quả in ra màn hình của chương trình được viết.

**1**
struct S{
  int i;
  char c;
} s;

main(){
  return sizeof(*(&s));
}

A. 4
B. 5
C. 8
D. I don’t know.

2

main(){
  char a = 0;
  short int b = 0;
  return sizeof(b) == sizeof(a+b);
}

A. 0
B. 1
C. 2
D. I don’t know.

3

main(){
  char a = ‘ ‘ * 13;
  return a;
}

A. 416
B. 160
C. -96
D. I don’t know

4.

main()
{
  int i = 16;
  return (((((i >= i) << i) >> i) <= i));
}

A. 0
B. 1
C. 16
D. I don’t know.

5.

main(){
  int i = 0;
  return i++ + ++i;
}

A. 1
B. 2
C. 3
D. I don’t know.

Đáp án https://hackernoon.com/so-you-think-you-know-c-8d4e2cd6f6a6#.xd87t7kyv
Chúc mừng bạn @drgnz là người duy nhất trả lời đúng câu hỏi này :joy:

1 Like

Sao toàn mấy câu hỏi dị không thế anh :smiley:

1 Like

Thế này thì đc bao điểm :slight_smile:

  1. C
  2. B
  3. B
  4. B
  5. A
1 Like

Như này có đúng không ạ?

  1. B
  2. B
  3. A
  4. B
  5. B
1 Like

I dont know hết. :~

  1. Alignment này ko rõ ràng, như int a, char c.
    Lỡ có compiler thích sắp xếp lại thành char c, int a thì có thể sizeof(…) ra 5
    Tuy nhiên có compiler có thể thích thêm 1 byte vào luôn thành int a, char c + 1 byte padding thành 6 bytes.
    Nhưng, có thể có compiler không thích vậy -> Thêm hẳn 3 bytes trống vào thành 2 cái int nên cũng có thể thành 8 bytes cũng được. Chốt, I don;t know :smiley:

  2. Ta biết kiểu int dựa vào kiến trúc CPU, compiler. Như CPU với kiến trúc 16bit thì int = 16bit. Mà short int theo định nghĩa thì = 16bit. -> Nếu ở CPU 16bit thì 2 thằng này = nhau. Nhưng bây giờ thời đại 64bit, 32bit thì int có thể có size lớn hơn short int. Và hỏi luôn int ở đâu ra thì, theo mình nhớ tính toán trong C được tự động ép sang kiểu int -> a + b sẽ là 1 int

  3. Có vài kiến trúc 1 byte != 8 bit. Có một số máy cũ 1 byte có thể = 6, 7 thậm chí là 9 bit. Và C/C++ cũng không quy định 1 byte phải = 8 bit.

The C and C++ programming languages define byte as an “addressable unit of data storage large enough to hold any member of the basic character set of the execution environment”
-> Không biết nốt

  1. Như nói ở mục 2, int không theo chuẩn mà dựa vào đủ thứ tá lả, vậy chắc chắn sẽ có sự khác nhau giữa 16 và 32 bit

  2. Cái này chắc gần như ai cũng sẽ được cảnh báo rồi :smiley: Có thể nói đây là trường hợp bị undefined behavior được biên rất rộng rãi trong C cũng như C++.

5 Likes

Giả định là chạy trên hệ máy 32 bit

  1. B:
    (&s) giá trì vùng nhớ int là kiểu int
    ->(*(&s)) ô nhớ mà s nắm giữ ô nhớ này bao gồm kiểu int và char
    -> 5 byte
  2. B:
    sizeof(b) = 2 byte kiểm short int là 1/2 kiểu int
    a + b tự động được ép lên làm short int
    -> sizeof(a+b) cũng là 2 byte
    -> sizeof(b) == sizeof(a+b) //1
  3. B:
    -> mã ascii của space là 32 * 13 là 416: kiểu bit là 110100000
    -> tuy nhiên được set lại biến a kiểu char nên sẽ tràn bit
    -> 10100000 -> 160
  4. B
    -> (i >= i) là true: 1 bit 1
    -> bit 1 dịch 16 bit qua trái << i
    -> rồi lại dịch 16 bit qua phải >>i nên giá trị quay về ban đầu (cái này không nhớ chính xác lắm)
    -> 1 <= i -> true: 1
  5. B
    -> i++ = 0 (i lúc này là 1)
    -> ++i = 2 (i lúc này là 2)
    -> 0 + 2 = 2 -> B

Mọi người thấy sai cứ nói để mình update

1 Like

Ai muốn biết câu trả lời của câu 5 thì xem ở đây: http://gynvael.coldwind.pl/?id=372 (English)

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