Ngân hàng câu hỏi của chương

Câu hỏi: PRF192 - Phần 2: Biến, kiểu dữ liệu, toán tử và biểu thức

47 câu trắc nghiệm kèm lời giải của môn PRF192 - Cơ sở lập trình, xếp theo thứ tự nhập vào ngân hàng. Trang 3/3 — câu 41–47.

Danh sách câu hỏi

47/47 câuHết danh sách
41What will the following code output?4 lựa chọncó code
Đề bài
#include <stdio.h>
int main() {
    int a = 5, b = 3;
    printf("%d", a & b);
    return 0;
}
A1
B2
C3
D5
Lời giải
Đáp án đúng: "1". Một dấu và đơn lẻ là phép và theo từng bit, khác hẳn hai dấu và của phép và logic. Viết 5 ở hệ hai là 0101, viết 3 là 0011; ghép từng cặp bit cùng vị trí, chỉ chỗ nào cả hai đều bằng 1 mới cho 1, nên kết quả là 0001, tức 1, và printf in nó bằng %d. Số "2" ở hệ hai là 0010, nó đòi bit thứ hai bằng 1 trong cả hai toán hạng, nhưng 5 không có bit đó. Số "3" là chính giá trị của b, ứng với việc hiểu nhầm dấu và thành phép lấy toán hạng bên phải. Số "5" là chính giá trị của a, ứng với việc hiểu nhầm thành phép lấy toán hạng bên trái; cả hai cách hiểu đó đều bỏ qua việc so từng bit, thứ làm nên bản chất của toán tử này.
Mở trang câu hỏi này →
A2 bytes
B1 byte
C8 bytes
D4 bytes
Lời giải
Đáp án đúng: "4 bytes". Trên gần như mọi trình dịch C hiện hành, float là số thực theo chuẩn IEEE 754 độ chính xác đơn: ba mươi hai bit chia thành một bit dấu, tám bit số mũ và hai mươi ba bit phần định trị, tức đúng bốn byte, và sizeof(float) trả về 4. Số "2 bytes" là kích thước thường thấy của short int, không có kiểu thực chuẩn nào nhỏ như vậy. Số "1 byte" là kích thước của char, kiểu mà chuẩn ấn định bằng một byte, quá nhỏ để chứa cả dấu, số mũ và phần định trị. Số "8 bytes" là kích thước của double, bản độ chính xác kép với mười một bit số mũ và năm mươi hai bit định trị; chính vì gấp đôi chỗ mà double giữ được nhiều chữ số nghĩa hơn float.
Mở trang câu hỏi này →
43Given the following code snippet:4 lựa chọncó code
Đề bài
#include <stdio.h>
#define MONTHS_IN_YEAR 12
int main() {
    const int WORKING_DAYS = 22;
    printf("%d ", MONTHS_IN_YEAR);
    printf("%d", WORKING_DAYS);
    return 0;
}

Choose the correct statement:

AThe output will be: 12 22
BNo output
CCompile error
DRuntime error
Lời giải
Đáp án đúng: "The output will be: 12 22". Dòng define là chỉ thị tiền xử lý: trước khi dịch, mọi chỗ viết MONTHS_IN_YEAR bị thay bằng dãy ký tự 12, nên lệnh in đầu nhận hằng số 12. Biến WORKING_DAYS khai báo const int kèm giá trị khởi tạo là hợp lệ, vì const chỉ ngăn gán lại về sau chứ không ngăn khởi tạo, nên lệnh in thứ hai cho 22. Chuỗi định dạng đầu có dấu cách sau %d nên hai số cách nhau một khoảng. Kết luận "No output" sai vì cả hai lệnh printf đều chạy với đối số hợp lệ. Kết luận "Compile error" sai vì không có vi phạm nào: tên hằng viết hoa chỉ là quy ước, và const int khởi tạo ngay là lối dùng đúng. Kết luận "Runtime error" sai vì chương trình chỉ in hai số nguyên rồi trả về 0, không chạm tới vùng nhớ nào có thể gây lỗi.
Mở trang câu hỏi này →
A0
B1
C10
D11
Lời giải
Đáp án đúng: "0". Dấu chấm than là phép phủ định logic trên một toán hạng: C coi mọi giá trị khác không là đúng và chỉ số không là sai, còn kết quả của phép logic luôn là int mang giá trị 0 hoặc 1. Toán hạng 1 là đúng nên phủ định nó cho sai, tức 0. Số "1" là kết quả của phép phủ định hai lần, hoặc là chính toán hạng ban đầu khi quên áp phép toán. Số "10" ứng với cách hiểu nhầm dấu chấm than thành phép ghép ký tự, như thể viết 1 rồi 0 cạnh nhau; C không có phép nối số kiểu đó. Số "11" cũng là một dãy ký tự ghép lại, lại thêm hiểu nhầm rằng phủ định của 1 vẫn là 1. Cần phân biệt phủ định logic với đảo bit, vì đảo bit của 1 trên int bốn byte cho -2.
Mở trang câu hỏi này →
Aint a = 25;
Ba = 25;
CInt a = 25;
Da = (Int) 25;
Lời giải
Đáp án đúng: "int a = 25;". Một khai báo đầy đủ cần tên kiểu đứng trước, rồi tên biến, và có thể kèm dấu bằng với giá trị khởi tạo; int là từ khoá kiểu nguyên viết toàn chữ thường, nên dòng này vừa tạo biến vừa gán giá trị đầu cho nó. Dòng "a = 25;" chỉ là một phép gán, nó đòi a phải được khai báo ở đâu đó trước; chuẩn C hiện hành đã bỏ luật ngầm hiểu kiểu int nên dòng này không tự tạo ra biến. Dòng "Int a = 25;" sai vì C phân biệt chữ hoa chữ thường, từ viết hoa đó không phải từ khoá mà bị coi là một tên kiểu chưa từng định nghĩa. Dòng "a = (Int) 25;" mắc cả hai lỗi cùng lúc: không có khai báo kiểu cho a, và phép ép kiểu lại viện tới một tên kiểu không tồn tại.
Mở trang câu hỏi này →
A2.5
B2.0
C2
D3.5
Lời giải
Đáp án đúng: "2.0". Biểu thức 5 / 2 chỉ gồm hai hằng số nguyên nên trình dịch dùng phép chia nguyên, cho 2 và bỏ phần dư; kiểu của biến đích không quay lại ảnh hưởng cách tính biểu thức bên phải, đây là chỗ bẫy của câu hỏi. Giá trị 2 sau đó mới được nâng lên float thành 2.0, và %.1f in một chữ số sau dấu chấm nên màn hình hiện 2.0. Muốn có phép chia thực phải để ít nhất một toán hạng là số thực, chẳng hạn viết 5.0 / 2. Số "2.5" là kết quả của phép chia thực, chỉ xuất hiện khi đã có toán hạng thực. Số "2" là cách in một số nguyên bằng %d, còn %.1f luôn kèm dấu chấm và một chữ số. Số "3.5" không ứng với cách tính nào của 5 chia 2, dù chia nguyên hay chia thực.
Mở trang câu hỏi này →
A_abc
Bbc#
C1abc
Dcase
Lời giải

Đáp án đúng: "_abc". Tên định danh trong C chỉ gồm chữ cái, chữ số và dấu gạch dưới, ký tự đầu phải là chữ cái hoặc dấu gạch dưới, và tên không được trùng từ khoá; tên mở đầu bằng gạch dưới thoả cả ba điều kiện nên hợp lệ, dù theo quy ước lớp tên đó nên để dành cho thư viện. Tên "bc#" chứa dấu thăng, ký tự không thuộc tập cho phép; bộ phân tích từ vựng tách nó thành một ký tự riêng và câu khai báo vỡ. Tên "1abc" mở đầu bằng chữ số nên bị đọc như một hằng số, đúng điều cấm với ký tự đầu tiên. Tên "case" là từ khoá dành riêng cho nhãn trong cấu trúc switch; từ khoá đã có nghĩa cố định với trình dịch nên không dùng lại làm tên biến được.

Mở trang câu hỏi này →