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
Sao toàn mấy câu hỏi dị không thế anh
Thế này thì đc bao điểm
Như này có đúng không ạ?
I dont know hết. :~
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
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
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.
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
Cái này chắc gần như ai cũng sẽ được cảnh báo rồi 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++.
Giả định là chạy trên hệ máy 32 bit
(&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
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
-> 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
-> (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
-> 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
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)