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 2/3 — câu 21–40.
Danh sách câu hỏi
40/47 câuCòn 7
AChanging from one form of representation to another
BA category of data that represents individual, non-complex elements such as integers, floating-point numbers, and characters
CPerforming operations and expressions on data
DStoring a collection of elements accessible by an index or a key
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "A category of data that represents individual, non-complex elements such as integers, floating-point numbers, and characters". Kiểu dữ liệu đơn giản là những kiểu mà mỗi giá trị là một đơn vị trọn vẹn, không tách ra thành các thành phần nhỏ hơn có tên riêng, và được ngôn ngữ dựng sẵn cùng bộ phép toán của nó. Chúng đứng đối lập với kiểu có cấu trúc như mảng hay struct, nơi một giá trị gom nhiều phần tử. Ý "Changing from one form of representation to another" sai vì đó mô tả việc chuyển đổi biểu diễn hoặc chuyển kiểu, một hành động chứ không phải một nhóm kiểu. Ý "Performing operations and expressions on data" sai vì đó nói về phép toán và biểu thức, tức cách xử lý dữ liệu. Ý "Storing a collection of elements accessible by an index or a key" sai vì đó đúng là định nghĩa của kiểu có cấu trúc, trái hẳn tính không phức hợp mà câu hỏi nhắc tới.
22What does a data type tell us about a variable?4 lựa chọn
AThe color of the variable
BHow much space the variable needs in memory
CHow fast the variable runs
DThe name of the variable
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "How much space the variable needs in memory". Khi khai báo một biến, kiểu dữ liệu là thứ nói cho trình biên dịch biết phải dành bao nhiêu byte cho biến đó, đồng thời quyết định cách diễn giải dãy bit ấy và tập phép toán hợp lệ trên nó; cùng một ô nhớ bốn byte có thể là số nguyên có dấu hoặc số thực tuỳ kiểu đã khai. Mô tả "The color of the variable" không mang nghĩa nào trong C, biến là một vùng nhớ chứ không phải đối tượng hiển thị. Mô tả "How fast the variable runs" lẫn lộn khái niệm: biến không chạy, tốc độ là chuyện của mã máy sinh ra cho các phép toán, dù kiểu rộng hơn có thể khiến phép tính tốn thêm lệnh. Mô tả "The name of the variable" lẫn tên với kiểu: tên do người lập trình đặt và chỉ là nhãn cho vị trí nhớ, hai biến khác tên vẫn có thể cùng kiểu, còn một biến thì không thể có hai kiểu.
Astring a;
Bfloat a = 3e2;
Cint* a;
Dfloat *a;
Echar * a;
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "string a;". C không có kiểu chuỗi dựng sẵn; một chuỗi trong C là mảng char kết thúc bằng ký tự có mã 0, vì vậy tên kiểu string không tồn tại trong ngôn ngữ và dòng khai báo đó chỉ dịch được nếu chính người lập trình tạo ra cái tên ấy bằng typedef hoặc struct. Khai báo "float a = 3e2;" hợp lệ, vì 3e2 là cách viết khoa học của 300.0, một hằng số thực. Khai báo "int* a;" hợp lệ, dấu sao viết sát tên kiểu chỉ là cách trình bày, trình biên dịch vẫn đọc ra con trỏ tới int. Khai báo "float *a;" cũng vậy, khoảng trắng quanh dấu sao không mang nghĩa nào với bộ phân tích cú pháp. Khai báo "char * a;" là con trỏ tới char, dạng quen dùng để trỏ vào chuỗi, hoàn toàn đúng cú pháp. Bốn dòng vừa nêu đều là khai báo chuẩn, chỉ cái tên kiểu không hề tồn tại mới bị loại.
A5
B22
C18
D25
E28
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "25". Hằng 0x11 viết ở hệ mười sáu nên có giá trị 17 với dãy bit 10001; hằng 010 mở đầu bằng chữ số 0 nên C đọc là hệ tám, giá trị 8 với dãy bit 01000. Phép hoặc theo bit xét từng cặp bit và bật kết quả khi có ít nhất một bên bật, cho 11001, tức 25. Một tính chất giúp loại nhanh: phép hoặc chỉ bật thêm bit, không bao giờ tắt bit đang bật, nên kết quả không thể nhỏ hơn 17. Vì thế giá trị "5" bị loại ngay, nó còn nhỏ hơn cả toán hạng thứ nhất. Giá trị "22" có dãy bit 10110, vừa tắt mất bit thấp nhất mà 17 đang bật, vừa bật bit giá trị 4 mà không toán hạng nào bật. Giá trị "18" có dãy bit 10010, cũng tắt bit thấp nhất của 17 nên không thể là kết quả. Giá trị "28" có dãy bit 11100, mất bit thấp nhất và tự sinh bit giá trị 4, đó là kiểu sai do cộng dồn chứ không phải do lấy hoặc theo bit.
25What is the results will be displayed on the screen after executing the following code:4 lựa chọncó code
int a[] = {1,2,3,4};
int i, s = 0;
for (i=0; i<4; ++i)
s += a[i];
printf("%f", (float)(s/4));A2.5
B2
C2.500000
D2.000000
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "2.000000". Vòng for cộng dồn 1, 2, 3, 4 vào s nên s bằng 10; cả s và 4 đều là số nguyên nên s/4 là phép chia nguyên, cho 2 chứ không phải 2.5, phần dư bị cắt ngay tại đó. Phép ép kiểu sang float chỉ tác động lên con số 2 đã mất phần dư, biến nó thành 2.0, và đặc tả %f in số thực với sáu chữ số sau dấu thập phân nên màn hình hiện 2.000000. Giá trị "2.5" là kết quả nếu ép kiểu trước khi chia, nhưng ngay cả khi đó %f vẫn in thành 2.500000 chứ không in gọn một chữ số. Giá trị "2" là con số đúng của phép chia nguyên nhưng ứng với cách in bằng %d. Giá trị "2.500000" đúng khuôn in của %f nhưng vẫn cần một phép chia thực, điều không xảy ra khi hai toán hạng đều là số nguyên.
26What will be printed after execution of the following program code?4 lựa chọncó code
#include <stdio.h>
int main() {
int a=12, b=5;
a=a^b;
b=a^b;
a=a^b;
printf("%d %d",a,b);
return 0;
}A5 12
B12 5
C9 5
D12 9
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "5 12". Phép hoặc loại trừ theo bit tự nghịch đảo, nên ba lệnh liên tiếp đổi chỗ được hai giá trị mà không cần biến tạm. Theo từng bước: a bằng 12 là dãy bit 1100, b bằng 5 là 0101; lệnh thứ nhất cho a thành 1001 tức 9; lệnh thứ hai lấy 1001 với 0101 cho b thành 1100 tức 12, đúng giá trị ban đầu của a; lệnh thứ ba lấy 1001 với 1100 cho a thành 0101 tức 5, đúng giá trị ban đầu của b. Lệnh in xuất a là 5 rồi b là 12. Dãy "12 5" là hai giá trị ban đầu, tức giả định ba lệnh không làm gì. Dãy "9 5" dừng ở trạng thái ngay sau lệnh thứ nhất, lúc a đã thành 9 nhưng b chưa đổi. Dãy "12 9" ghép giá trị ban đầu của a với con số trung gian 9, không ứng với trạng thái nào sau khi cả ba lệnh chạy xong.
27What is the size of the char data type in bytes?4 lựa chọn
A1 byte
B2 bytes
C4 bytes
DIt depends on the system
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "1 byte". Chuẩn C định nghĩa byte là đơn vị nhớ nhỏ nhất đánh địa chỉ được, rồi quy định kích thước của kiểu char luôn bằng 1 theo đúng nghĩa đó; mọi kích thước khác trong ngôn ngữ đều đo bằng số lần kích thước của char, nên con số 1 không phụ thuộc máy. Giá trị "2 bytes" ứng với kiểu ký tự rộng dùng cho bảng mã nhiều byte trên một số nền tảng, không phải char. Giá trị "4 bytes" là kích thước quen thuộc của int trên máy hiện nay, không liên quan tới ký tự. Mô tả "It depends on the system" nghe có lý vì int hay long thật sự đổi kích thước theo nền tảng, nhưng với char thì không: thứ đổi theo máy là số bit trong một byte, tối thiểu là 8 và có thể hơn trên phần cứng đặc biệt, còn kích thước tính theo byte của char vẫn luôn bằng 1.
28Using DeMorgan's Law, how would you correctly negate the condition (x >= 10 && x <= 20)?4 lựa chọn
A(x < 10 || x > 20)
B(x > 10 && x < 20)
C(x < 10 && x > 20)
D!(x >= 10 || x <= 20)
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "(x < 10 || x > 20)". Luật De Morgan nói phủ định của một phép và chuyển thành phép hoặc của hai phủ định, nên phủ định của mệnh đề x lớn hơn hoặc bằng 10 và x nhỏ hơn hoặc bằng 20 là x nhỏ hơn 10 hoặc x lớn hơn 20; từng phép so sánh cũng phải đảo cho đúng, vì phủ định của lớn hơn hoặc bằng là nhỏ hơn hẳn. Biểu thức "(x > 10 && x < 20)" vẫn giữ phép và, nó chỉ thu hẹp khoảng cũ chứ không phủ định: với x bằng 15 thì cả nó lẫn mệnh đề gốc đều đúng, trong khi phủ định phải cho giá trị ngược nhau. Biểu thức "(x < 10 && x > 20)" cũng giữ phép và nên không bao giờ đúng, không số nào vừa nhỏ hơn 10 vừa lớn hơn 20. Biểu thức "!(x >= 10 || x <= 20)" đổi phép và thành phép hoặc rồi mới phủ định cả khối, làm sai cả hai bước; phần trong ngoặc đúng với mọi x nên cả biểu thức luôn sai.
29How to declare a variable in C language?5 lựa chọn
AAll variables must be declared before we use them in C program.
BTo declare a variable you specify its name and data type it can store.
CAll variable are always stored on the stack.
DReading a value from keyboard or other device with a OUT statement
EThe scope of a variable is the range of program statements that can't access that variable.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "To declare a variable you specify its name and data type it can store.". Câu hỏi đòi mô tả cách khai báo, và một khai báo trong C đúng là gồm tên kiểu rồi tên biến, nhờ đó trình biên dịch biết dành bao nhiêu byte cùng cách diễn giải byte ấy. Câu "All variables must be declared before we use them in C program." nói một điều đúng về ngôn ngữ, nhưng nó nêu nghĩa vụ phải khai trước khi dùng chứ không nói cách khai, nên không trả lời câu hỏi. Câu "All variable are always stored on the stack." sai: biến toàn cục và biến static nằm ở vùng dữ liệu tĩnh suốt đời chương trình, chỉ biến cục bộ tự động mới nằm trên ngăn xếp. Câu "Reading a value from keyboard or other device with a OUT statement" mô tả việc nhập dữ liệu và còn nhắc một lệnh không tồn tại trong C. Câu "The scope of a variable is the range of program statements that can't access that variable." định nghĩa ngược, vì phạm vi là vùng mã nhìn thấy được biến.
30What does this code print?4 lựa chọncó code
int n = 30, m = 5;
float x = 3.5F, y = 8.12F;
printf("%d, %d\n", (n < m || x >= y), !(x > y));A1, 0
B0, 1
C1, 1
D0, 0
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "0, 1". Hai biểu thức trong printf đều là biểu thức luận lý, nên mỗi cái chỉ cho ra số nguyên 0 hoặc 1. Với n bằng 30 và m bằng 5 thì n nhỏ hơn m là sai; với x bằng 3.5 và y bằng 8.12 thì x lớn hơn hoặc bằng y cũng sai, nên phép hoặc của hai điều sai cho 0. Biểu thức thứ hai: x lớn hơn y là sai, tức giá trị 0, nên phủ định nó cho 1. Vậy chương trình in 0, 1. Lựa chọn "1, 0" đảo ngược hai kết quả, chỉ đúng nếu 30 nhỏ hơn 5 hoặc 3.5 lớn hơn 8.12. Lựa chọn "1, 1" đòi phép hoặc phải có ít nhất một vế đúng, điều không xảy ra ở đây vì cả hai vế đều sai. Lựa chọn "0, 0" đòi x lớn hơn y là đúng để phủ định cho ra 0, nhưng 3.5 nhỏ hơn 8.12 nên phủ định phải cho 1.
31What is the output of the following code?4 lựa chọncó code
int a = 10, b = 20;
printf("%d", (a > 5 && b < 25));A0
B1
C10
D20
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "1". Phép và luận lý trong C trả về một giá trị int: 1 khi cả hai vế đúng, 0 khi có vế sai. Ở đây a bằng 10 nên a lớn hơn 5 là đúng, b bằng 20 nên b nhỏ hơn 25 cũng đúng, vì vậy cả biểu thức cho 1 và đặc tả số nguyên in ra 1. Cần nhớ C không có kiểu luận lý riêng: mọi phép so sánh đều cho ra số nguyên 0 hoặc 1, và ngược lại mọi giá trị khác 0 đều được coi là đúng khi xét điều kiện. Lựa chọn "0" chỉ xuất hiện khi ít nhất một vế sai, chẳng hạn nếu b bằng 30. Lựa chọn "10" là giá trị của a, nhưng phép và luận lý không trả lại toán hạng như một số ngôn ngữ khác, nó chuẩn hoá kết quả về 0 hoặc 1. Lựa chọn "20" tương tự là giá trị của b, cũng không phải kết quả của một phép so sánh.
32What is the output of the variable "sum" in the following code:4 lựa chọncó code
int a[] = {1, 2, 3, 4, 5}, i;
float sum = 0;
for (i = 0; i < 4; i++) {
sum = sum + a[i]/a[i+1];
}
printf("%.2f", sum);A0.00
B2.72
C2.80
DRuntime Error
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "0.00". Mỗi hạng tử là phép chia giữa hai phần tử int, nên kết quả bị cắt về số nguyên ngay trước khi được cộng vào sum; việc sum có kiểu float không cứu được gì vì sự cắt đã xảy ra rồi. Bốn lượt cho 1 chia 2 bằng 0, 2 chia 3 bằng 0, 3 chia 4 bằng 0 và 4 chia 5 bằng 0, nên sum vẫn là 0 và in ra 0.00. Muốn có chia thực phải ép một toán hạng sang float trước khi chia. Lựa chọn "2.72" chính là tổng khi chia thực, tức 0.5 cộng 0.67 cộng 0.75 cộng 0.8, nên nó giả định sai rằng kiểu của biến nhận kết quả quyết định kiểu của phép chia. Lựa chọn "2.80" không khớp với tổng nào ở đây, dù tính theo chia nguyên hay chia thực. Lựa chọn "Runtime Error" lo nhầm về vượt biên, nhưng i chỉ chạy tới 3 nên chỉ số lớn nhất được đọc là 4, vẫn nằm trong năm phần tử.
33What will the following program output?4 lựa chọncó code
#include <stdio.h>
#define ANSWER 42
int main() {
printf("%d", ANSWER);
return 0;
}A42
BANSWER
CCompilation Error
DNo Output
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "42". Chỉ thị define thuộc bộ tiền xử lý: trước khi trình dịch thấy mã, bộ tiền xử lý thay mọi lần xuất hiện của tên hằng trong luồng mã nguồn bằng dãy ký tự 42. Vì vậy lệnh in thực chất nhận một hằng nguyên 42 và màn hình hiện 42. Hằng kiểu này không phải biến, không chiếm ô nhớ, không có kiểu riêng; nó chỉ là phép thay thế văn bản. Lựa chọn "ANSWER" sẽ đúng nếu tên hằng nằm bên trong một hằng chuỗi, vì bộ tiền xử lý không thay thế bên trong chuỗi; ở đây tên nằm ngoài chuỗi, tại vị trí đối số, nên nó bị thay. Lựa chọn "Compilation Error" sai vì sau khi thay thế, đặc tả số nguyên khớp đúng với một hằng nguyên. Lựa chọn "No Output" sai vì printf vẫn được gọi và luôn xuất ra dòng chuẩn.
34What does the following code print?6 lựa chọncó code
float y = 3 / 2;
printf("%f", y);A1.000000
B1.500000
C1.0
D1.5
E1
FCompiler error
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "1.000000". Phép 3 chia 2 có hai toán hạng đều là hằng nguyên, nên C thực hiện chia nguyên và cắt phần thập phân ngay tại đó, cho ra 1; kiểu của biến nhận kết quả không hề tham gia quyết định phép chia nào được dùng. Chỉ sau khi đã có 1, giá trị ấy mới được chuyển ngầm thành 1.0 khi gán cho y. Đặc tả số thực in sáu chữ số sau dấu thập phân theo mặc định, nên màn hình hiện 1.000000. Lựa chọn "1.500000" chỉ đúng nếu ít nhất một toán hạng là số thực, chẳng hạn viết 3.0 chia 2. Lựa chọn "1.0" sai về dạng in vì đặc tả này không rút ngắn phần thập phân. Lựa chọn "1.5" sai cả về giá trị lẫn dạng in. Lựa chọn "1" là dạng của đặc tả số nguyên chứ không phải số thực. Lựa chọn "Compiler error" sai vì gán một số nguyên cho biến float là chuyển kiểu hợp lệ.
Aa >= b
Ba == b
Ca != b
Da := b
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "a := b". C không có toán tử gồm dấu hai chấm kèm dấu bằng; cách viết đó là phép gán của Pascal, đưa vào mã C sẽ bị báo lỗi cú pháp. Trong C, gán là một dấu bằng, so sánh bằng là hai dấu bằng, và đây cũng là nguồn lỗi kinh điển khi người viết gõ thiếu một dấu bằng trong câu điều kiện: phép gán vẫn là biểu thức hợp lệ nên trình dịch không nhất thiết báo gì. Lựa chọn "a >= b" là phép so sánh lớn hơn hoặc bằng, hoàn toàn hợp lệ. Lựa chọn "a == b" là phép so sánh bằng đúng chuẩn, trả về 1 hoặc 0. Lựa chọn "a != b" là phép so sánh khác, cũng hợp lệ và cũng trả về số nguyên 1 hoặc 0.
Aint i = (double)123.5;
Bdouble t = double(2);
Cdouble t = (double) 2;
Ddouble t = (int) 2.7;
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "int i = (double)123.5;". Hằng 123.5 vốn đã mang kiểu double nên phép ép kiểu viết ra ở đây không làm gì cả; việc thật sự xảy ra là phép chuyển ngầm khi gán một giá trị double cho biến int, và chính phép chuyển ngầm đó cắt phần thập phân để i nhận 123. Đó là mẫu chuyển kiểu ngầm thu hẹp kinh điển mà câu hỏi nhắm tới. Lựa chọn "double t = double(2);" không phải cú pháp của C, cách gọi kiểu như hàm chỉ có trong C++. Lựa chọn "double t = (double) 2;" đã nói rõ ý định bằng phép ép kiểu tường minh, sau đó không còn phép chuyển nào nữa vì hai bên đã cùng kiểu. Lựa chọn "double t = (int) 2.7;" cũng có một bước ngầm từ int lên double, nhưng bước ấy giữ nguyên giá trị, còn thay đổi đáng kể là cắt 2.7 xuống 2 thì đã do phép ép kiểu tường minh làm, nên dòng này tiêu biểu cho chuyển kiểu tường minh.
ATo define how values are stored and how operations are performed
BTo determine the variable name and its scope within the program
CTo specify the program's execution order and control flow
DTo control the program's memory allocation and deallocation process
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "To define how values are stored and how operations are performed". Kiểu dữ liệu quyết định hai điều: số byte cấp cho biến cùng cách các byte đó mã hoá giá trị, và tập phép toán cùng ngữ nghĩa khi áp lên giá trị. Chính vì thế 5 / 2 cho 2 với int nhưng cho 2.5 với double, còn con trỏ int nhảy bốn byte mỗi lần tăng. Mô tả "To determine the variable name and its scope within the program" sai vì tên do người viết đặt, còn phạm vi do vị trí khai báo quyết định. Mô tả "To specify the program's execution order and control flow" là việc của câu rẽ nhánh và vòng lặp. Mô tả "To control the program's memory allocation and deallocation process" chỉ đúng một góc rất nhỏ: cấp phát rồi thu hồi vùng nhớ động là việc của malloc và free, kiểu chỉ cho biết một giá trị cần bao nhiêu byte.
A+=
B+
C++
D-
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "+=". Bảng ưu tiên của C xếp phép gán, kể cả gán phức hợp, ở gần đáy, chỉ trên toán tử phẩy; lý do là gán phải nhận trọn giá trị của biểu thức bên phải nên mọi phép tính bên phải buộc phải xong trước. Vì thế a += b * 2 được hiểu là a += (b * 2) chứ không phải (a += b) * 2. Toán tử "+" cộng hai toán hạng, nằm ở mức cộng trừ, chặt hơn mức gán. Toán tử "++" tăng một đơn vị, thuộc nhóm một toán hạng, đứng ở mức cao nhất cùng với ngoặc tròn và chỉ số mảng. Toán tử "-" khi trừ hai số thì cùng mức với phép cộng, còn khi làm dấu âm một toán hạng thì còn cao hơn nữa, nên cả ba đều ưu tiên hơn phép gán phức hợp.
39What is the value of variable b after running the program?4 lựa chọncó code
#include <stdio.h>
int main()
{
int x = 5, y = 3, z = 1;
x = x % 3 + z++;
z = x * y--;
printf("%d %d %d", x, y, z);
return 0;
}A5 3 1
B3 2 9
C2 2 5
DCompiler error
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "3 2 9". Đề hỏi biến b nhưng chương trình không có biến nào tên b, nên chỉ có thể trả lời theo đúng thứ printf in ra. Dòng x = x % 3 + z++ tính 5 % 3 bằng 2, còn z++ là tăng sau nên nó đưa vào biểu thức giá trị cũ 1 rồi mới nâng z lên 2; vậy x thành 3. Dòng z = x * y-- lấy x bằng 3 nhân với giá trị cũ của y là 3, cho 9, sau đó y giảm còn 2. Lúc printf chạy, x bằng 3, y bằng 2, z bằng 9. Dãy "5 3 1" là bộ giá trị khởi tạo ban đầu, tức bỏ qua cả hai phép gán. Dãy "2 2 5" ứng với việc tính x chỉ bằng 5 % 3 mà bỏ quên phần cộng z++, nên cả ba số sau đó đều lệch. Kết luận "Compiler error" sai vì mã hợp lệ: phép lấy dư, tăng sau và giảm sau đều áp đúng trên biến int.
40What will be the output of the C program?4 lựa chọncó code
int 2_var = 15;
printf("%d", 2_var);A0
B15
CCompilation error.
DRuntime error.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Compilation error." Tên định danh trong C phải bắt đầu bằng chữ cái hoặc dấu gạch dưới, các ký tự sau mới được là chữ số. Dãy 2_var mở đầu bằng chữ số nên bộ phân tích từ vựng tách nó thành hằng số 2 rồi tới _var, câu khai báo trở thành vô nghĩa và lỗi bị bắt ngay lúc dịch, chương trình không bao giờ có tệp chạy. Kết quả "0" giả định biến vẫn tồn tại và mang giá trị rỗng, điều chỉ xảy ra với biến toàn cục chưa gán. Kết quả "15" giả định khai báo chạy được và printf in đúng số vừa gán, nhưng đoạn mã không qua nổi bước dịch nên không có gì được in. Kết luận "Runtime error." đòi chương trình phải chạy rồi mới hỏng, trong khi đây là lỗi cú pháp thuần, phát hiện trước khi chạy.