Tất cả câu hỏi
Ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết.
240/11.033 câuCòn 10.793
221What is correct about strcpy(s1, s2) function?5 lựa chọn
ACompare two s1 strings and s2 string
BCopy s2 string to s1 string
CCopy s1 string to s2 string
DConcatenate string s2 to the end of s1
EFind the address of a substring
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Copy s2 string to s1 string". Thứ tự tham số của nhóm hàm chuỗi trong C luôn là đích trước, nguồn sau, cùng chiều với phép gán; vì vậy lời gọi strcpy(s1, s2) chép nội dung của s2 sang vùng nhớ s1, ghi đè từ byte đầu tiên và chép cả ký tự kết thúc. Mô tả "Compare two s1 strings and s2 string" là việc của strcmp, hàm đó chỉ đọc hai chuỗi rồi trả về một số nguyên theo thứ tự từ điển, không ghi vào đâu cả. Mô tả "Copy s1 string to s2 string" đảo chiều, hiểu như thế thì dữ liệu đi sai hướng và vùng lẽ ra phải được cập nhật vẫn nguyên như cũ. Mô tả "Concatenate string s2 to the end of s1" là việc của strcat, hàm đó giữ nội dung cũ của s1 và ghi tiếp từ ký tự kết thúc. Mô tả "Find the address of a substring" là việc của strstr, hàm trả về con trỏ tới chỗ tìm thấy hoặc con trỏ rỗng.
222What commands are used to write data appended to the end of the file?(Choose 2 correct answers)5 lựa chọn
AFILE *f = fwrite("output.txt", "a" );
BFILE *f = fopen("output.txt", "a" );
CFILE *f = fopen("output.txt", "a+" );
DFILE *f = fopen("output.txt", "w+" );
EFILE *f = fopen("output.txt ", "w" );
Lời giải
Mở trang câu hỏi này →Đáp án đúng gồm hai ý: "FILE *f = fopen("output.txt", "a" );" và "FILE *f = fopen("output.txt", "a+" );". Chế độ ghi nối giữ nguyên nội dung cũ và đặt mọi lần ghi xuống cuối tệp, bất kể chỉ báo vị trí đang ở đâu; tệp chưa tồn tại thì thư viện tạo mới. Chế độ nối có thêm dấu cộng cũng ghi ở cuối, chỉ mở thêm quyền đọc, nên vẫn thoả yêu cầu. Lệnh "FILE *f = fwrite("output.txt", "a" );" sai hàm: fwrite không mở tệp mà ghi một khối dữ liệu, nó cần bốn đối số gồm con trỏ dữ liệu, kích thước phần tử, số phần tử và con trỏ tệp, lại trả về số phần tử đã ghi chứ không trả về con trỏ tệp. Lệnh "FILE *f = fopen("output.txt", "w+" );" cắt tệp về rỗng ngay khi mở nên dữ liệu cũ mất sạch, đó là ghi mới chứ không phải ghi thêm. Lệnh "FILE *f = fopen("output.txt ", "w" );" cũng cắt tệp, ngoài ra tên tệp còn thừa một dấu cách nên trỏ sang tên khác.
223If the file "data.txt" contains:
Hello World
42
Consider the following complete C program that reads data from a file:4 lựa chọncó code
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("data.txt", "r");
char buffer[100];
int number;
if (fp != NULL) {
fgets(buffer, sizeof(buffer), fp);
fscanf(fp, "%d", &number);
fclose(fp);
}
return 0;
}What will be stored in the variables after execution?
Abuffer = "Hello World\n", number = 42
Bbuffer = "Hello World", number = 42
Cbuffer = "Hello", number = 0
Dbuffer = "Hello World\n", number = undefined
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "buffer = "Hello World\n", number = 42". Hàm fgets đọc tới hết dòng hoặc tới khi gần đầy vùng đệm, nó giữ lại ký tự xuống dòng rồi mới thêm ký tự kết thúc chuỗi; vùng đệm 100 byte đủ chứa dòng đầu nên buffer nhận trọn Hello World kèm ký tự xuống dòng. Chỉ báo vị trí tệp lúc này nằm ở đầu dòng thứ hai, nên fscanf với đặc tả %d bỏ qua khoảng trắng dẫn đầu, đọc hai chữ số và ghi 42 vào number. Mô tả "buffer = "Hello World", number = 42" bỏ mất ký tự xuống dòng, mà đó đúng là chỗ khác nhau giữa fgets và các hàm đọc dòng kiểu cũ. Mô tả "buffer = "Hello", number = 0" ứng với cách đọc theo từ của scanf với đặc tả chuỗi, còn fgets không dừng ở khoảng trắng. Mô tả "buffer = "Hello World\n", number = undefined" sai ở phần số: dòng thứ hai có số nguyên hợp lệ nên fscanf đọc được và báo đã gán một giá trị.
224What is the maximum index of the last character in a character array initialized with a size is 10?4 lựa chọn
A9
B10
C8
DIt depends on the contents of the array
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "9". Chỉ số mảng trong C đếm từ 0, nên mảng khai với kích thước 10 có các ô mang chỉ số từ 0 tới 9 và ô cuối cùng là 9; đây là hệ quả trực tiếp của cách ngôn ngữ tính địa chỉ, vì ô thứ k nằm cách đầu mảng đúng k lần kích thước một phần tử. Giá trị "10" là số phần tử chứ không phải chỉ số cuối; chạm vào ô mang chỉ số 10 là đọc ghi ra ngoài mảng, lỗi mà trình biên dịch không chặn giúp. Giá trị "8" là chỉ số của ký tự cuối khi mảng đang chứa một chuỗi dùng hết chỗ, vì khi đó ô cuối phải để dành cho ký tự kết thúc, nhưng câu hỏi hỏi chỉ số lớn nhất của mảng chứ không hỏi chuỗi. Mô tả "It depends on the contents of the array" không đúng: kích thước mảng cố định ngay từ lúc khai báo nên dải chỉ số không phụ thuộc nội dung đang chứa.
Ascanf will expect two integers inputted by user and write them to variables a and b.
Bscanf will expect two floating-point numbers inputted by user and write them to variables a and b.
Cscanf will expect two integers inputted by user separated by a comma, and write the first integer to variable a, the comma to variable b.
Dscanf will expect two integers inputted by user separated by a comma, and write the first integer to variable a, the second integer to variable b.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "scanf will expect two integers inputted by user separated by a comma, and write the first integer to variable a, the second integer to variable b.". Trong chuỗi định dạng của scanf, mỗi đặc tả %d đọc một số nguyên rồi ghi qua địa chỉ đi kèm, còn ký tự thường như dấu phẩy là đòi hỏi phải khớp đúng ký tự ấy trong dòng nhập; không gặp dấu phẩy thì scanf dừng ngay tại đó và biến thứ hai không nhận được gì. Vậy mô tả đúng phải nêu cả dấu phẩy phân cách lẫn thứ tự ghi vào a trước rồi b sau. Cách nói "scanf will expect two integers inputted by user and write them to variables a and b" bỏ mất ràng buộc dấu phẩy, khiến người đọc tưởng cứ cách nhau bằng khoảng trắng là đọc được. Cách nói "two floating-point numbers" sai đặc tả: số thực phải dùng %f cùng con trỏ float, đưa %d cho số thực là hành vi không xác định. Cách nói "the comma to variable b" sai bản chất: ký tự khớp được tiêu thụ rồi bỏ đi, scanf không lưu nó vào biến nào.
226Which of the following functions in C is used to reset the file position indicator to the beginning of the file?4 lựa chọn
A
fseek()B
fftell()C
rewind()D
return()Lời giải
Mở trang câu hỏi này →Đáp án đúng: "rewind()". Mỗi dòng tệp đang mở có một chỉ báo vị trí cho biết lần đọc hoặc ghi tiếp theo bắt đầu từ đâu; lời gọi rewind đưa chỉ báo đó về byte đầu tệp và xoá luôn cờ báo hết tệp cùng cờ lỗi, nhờ vậy đọc lại được từ đầu mà không cần mở lại. Hàm "fseek()" cũng dịch được chỉ báo và về được đầu tệp nếu truyền độ dời 0 với mốc đầu tệp, nhưng nó là hàm định vị tổng quát cần ba đối số chứ không phải hàm chuyên đưa về đầu, và nó không xoá cờ lỗi. Tên "fftell()" viết sai chính tả của ftell, mà việc của ftell cũng chỉ là báo lại vị trí hiện thời dưới dạng một con số, hoàn toàn không dịch chuyển gì. Tên "return()" là từ khoá trả giá trị khỏi hàm, không liên quan tới tệp và cũng không phải hàm thư viện.
227What will be the output of the following program?4 lựa chọncó code
void func(int *p){
int j =11;
*p = j;
}
int main() {
int i = 1;
int *p = &i;
func(p);
printf("%d,%d", i, *p);
getchar();
return 0;
}A11,11
B1,1
C0,0
D0,1
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "11,11". Biến i của hàm chính bằng 1 và p giữ địa chỉ của i, nên truyền p vào func là truyền chính địa chỉ đó chứ không phải một bản sao của giá trị. Trong func, biến cục bộ j bằng 11 và lệnh ghi qua con trỏ đặt 11 vào ô nhớ mà p trỏ tới, tức ghi thẳng vào i; j chết khi hàm kết thúc nhưng giá trị đã nằm lại trong i. Sau lời gọi, i là 11 và nội dung chỗ p trỏ tới cũng là 11 vì p vẫn trỏ vào i, nên lệnh in xuất hai số 11 cách nhau bởi dấu phẩy. Dãy "1,1" là kết quả nếu hàm chỉ gán cho bản sao tham số, chẳng hạn cho con trỏ trỏ sang j, khi đó i không đổi. Dãy "0,0" cần một phép đặt về không, không có trong mã. Dãy "0,1" còn đòi hai số khác nhau, trong khi i và nội dung chỗ p trỏ tới luôn là cùng một ô nhớ nên không thể lệch nhau.
228Assume we have the following code:4 lựa chọncó code
int i=4;
int *p = &i;What is the result of the following expression: ++*p?
A5
B4
C9
D12
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "5". Con trỏ p giữ địa chỉ của i, nên biểu thức lấy nội dung chỗ p trỏ tới chính là biến i và dùng được ở cả hai vai, đọc lẫn ghi. Hai toán tử một toán hạng ở đây cùng mức ưu tiên và kết hợp từ phải sang trái, nên phép tăng được áp lên giá trị đã lấy ra: i tăng từ 4 lên 5 trước khi biểu thức cho giá trị, và giá trị đó cũng là 5. Giá trị "4" là giá trị cũ của i, nó chỉ xuất hiện khi dùng dạng tăng sau viết với ngoặc quanh phần lấy nội dung, khi ấy biểu thức cho 4 còn i vẫn thành 5. Giá trị "9" cần cộng thêm năm đơn vị, không có phép nào trong mã làm việc đó. Giá trị "12" cần một phép nhân hoặc một lượng cộng lớn hơn hẳn, cũng không có nguồn nào sinh ra. Điều dễ lẫn là dạng tăng đặt sau tên con trỏ, vì khi đó phép tăng tác động lên con trỏ chứ không lên giá trị được trỏ tới.
AIt moved to the end of the sorted part
BIt moved to the beginning of the sorted part
CIt stays in its position
DIt removed from the array
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "It moved to the beginning of the sorted part". Sắp xếp nổi bọt tăng dần so từng cặp kề nhau và đổi chỗ khi cặp đó nghịch, nên sau một lượt quét phần chưa sắp, phần tử lớn nhất của phần đó bị đẩy dần tới ô cuối cùng của phần chưa sắp. Ô ấy nằm sát ngay vùng đã sắp ở đuôi mảng và từ lúc này thuộc vùng đã sắp, tức nó đứng ở vị trí đầu tiên của phần đã sắp xếp, còn ranh giới giữa hai phần lùi lại một ô. Mô tả "It moved to the end of the sorted part" chỉ đúng cho lượt đầu tiên, khi phần đã sắp còn rỗng nên ô cuối mảng vừa là đầu vừa là cuối; từ lượt thứ hai, cuối phần đã sắp luôn là ô cuối mảng đã có chủ từ trước. Mô tả "It stays in its position" trái với cơ chế đổi chỗ, phần tử lớn nhất bị mang đi sau mỗi lần so. Mô tả "It removed from the array" sai về bản chất, thuật toán chỉ đổi chỗ trong cùng một mảng và không xoá phần tử nào.
Aint linearSearch(int a[], int n)
Bint binarySearch(int x, int a[], int n)
Cint firstLinearSearch(double x, double a[], int n)
Dvoid sort(int a[], int n)
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "int binarySearch(int x, int a[], int n)". Tìm nhị phân cần đủ ba thứ: khoá cần tìm, mảng đã sắp xếp và số phần tử; mỗi bước nó so khoá với phần tử giữa rồi bỏ hẳn nửa không thể chứa khoá, nên nguyên mẫu phải có tham số cho khoá và kiểu trả về nguyên để đưa về chỉ số tìm được. Nguyên mẫu "int linearSearch(int a[], int n)" thiếu hẳn tham số khoá nên không có gì để so, và cái tên cũng chỉ ra lối tìm tuần tự. Nguyên mẫu "int firstLinearSearch(double x, double a[], int n)" đủ tham số nhưng tên nói rõ đây là tìm tuần tự từ đầu mảng, cách làm không đòi mảng phải sắp xếp trước. Nguyên mẫu "void sort(int a[], int n)" là hàm sắp xếp: nó trả về void nên không báo lại được vị trí nào, việc của nó là chuẩn bị dữ liệu cho tìm nhị phân chứ không phải tìm kiếm.
231What 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.
232What will the following program print?4 lựa chọncó code
#include <stdio.h>
int hours_and_minutes2(int total, int *pminutes) {
return (*pminutes = total % 60, total / 60);
}
int main() {
int minutes;
printf("Hours: %d, Minutes: %d\n", hours_and_minutes2(135, &minutes), minutes);
return 0;
}AHours: 2, Minutes: 15
BHours: 2, Minutes: 30
CHours: 3, Minutes: 15
DHours: 3, Minutes: 30
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Hours: 2, Minutes: 15". Lệnh trả về của hàm dùng toán tử phẩy: vế trái gán 135 phần trăm 60, tức phần dư 15, vào chỗ pminutes trỏ tới chính là biến minutes của hàm chính; vế phải lấy 135 chia 60 mà cả hai đều là số nguyên nên đó là phép chia lấy phần nguyên, cho 2. Giá trị của một biểu thức phẩy chính là giá trị vế phải, nên hàm trả về 2 và lệnh in xuất 2 cho giờ, 15 cho phút. Dãy "Hours: 2, Minutes: 30" đòi phần dư 30, nhưng 135 bớt đi hai lần 60 chỉ còn 15. Dãy "Hours: 3, Minutes: 15" đòi thương 3, trong khi ba lần 60 đã vượt quá 135. Dãy "Hours: 3, Minutes: 30" sai cả hai phần theo đúng hai lý do vừa nêu. Cần biết thêm rằng chuẩn C không ấn định thứ tự tính các đối số của một lời gọi, nên mã kiểu này chỉ cho kết quả như trên khi lời gọi hàm được tính trước lúc lấy giá trị của minutes.
A*/ Comments */
B** Comment **
C/* Comment */
D{ Comment }
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "/* Comment */". Chú thích khối trong C mở bằng dấu gạch chéo rồi dấu sao và đóng bằng dấu sao rồi gạch chéo; phần giữa bị bộ tiền xử lý thay bằng một khoảng trắng nên trình biên dịch không bao giờ thấy nội dung đó. Cách viết "*/ Comments */" đảo chỗ hai ký tự mở, mà dấu mở buộc phải là gạch chéo trước dấu sao, nên dòng đó bị đọc như biểu thức và báo lỗi. Cách viết "** Comment **" chỉ có hai dấu sao, ngôn ngữ đọc chúng thành phép nhân hoặc phép lấy nội dung con trỏ, không mở chú thích nào cả. Cách viết "{ Comment }" là cú pháp chú thích của Pascal, còn trong C cặp ngoặc nhọn tạo khối lệnh nên nội dung bên trong vẫn bị đòi phải là lệnh hợp lệ. Dạng chú thích thứ hai mà C cho phép là hai dấu gạch chéo kéo tới hết dòng.
Aint a[5] = {0};
Bint a[5] = [0, 0, 0, 0, 0];
Cint a[5] = (0, 0, 0, 0, 0);
Dint a[5];
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "int a[5] = {0};". Danh sách khởi tạo của mảng trong C đặt trong cặp ngoặc nhọn, và chuẩn quy định nếu số giá trị ít hơn số phần tử thì phần còn lại được khởi tạo về 0, nên viết đúng một số 0 là đủ để cả năm phần tử bằng 0. Cách viết "int a[5] = [0, 0, 0, 0, 0];" dùng ngoặc vuông làm danh sách, nhưng ngoặc vuông trong C chỉ dành cho khai kích thước và truy cập phần tử, nên đây là lỗi cú pháp. Cách viết "int a[5] = (0, 0, 0, 0, 0);" dùng ngoặc tròn nên vế phải thành một biểu thức với toán tử phẩy, giá trị của nó là một số 0 đơn lẻ và không thể gán cho cả mảng. Cách viết "int a[5];" không có phần khởi tạo: mảng cục bộ như vậy chứa đúng những byte rác còn lại trong bộ nhớ, chỉ mảng toàn cục hoặc static mới tự về 0, nên không bảo đảm được điều đề bài đòi.
235What is the output?4 lựa chọncó code
#include <stdio.h>
int main(){
int a=6,b=15;
int* ptr1= &a, *ptr2=&b;
*ptr1 +=12-b+ (*ptr2);
*ptr2 = b + a- 2*(*ptr1);
printf("%d, %d, %d", a,b,b+a*3);
}A18, -3, 51
B12, 3, 39
CSyntax error
DRuntime error
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "18, -3, 51". Hai con trỏ ptr1 và ptr2 lần lượt trỏ tới a và b, nên ghi qua con trỏ là ghi thẳng vào hai biến đó. Lệnh thứ nhất tính 12 - b + (*ptr2) với b bằng 15, được 12 - 15 + 15 là 12, rồi cộng dồn vào a nên a thành 6 + 12 là 18. Lệnh thứ hai tính b + a - 2*(*ptr1) với b bằng 15 và a đã là 18, được 15 + 18 - 36 là -3, gán qua ptr2 nên b thành -3. Lệnh in xuất a là 18, b là -3, còn b + a*3 do phép nhân ưu tiên hơn phép cộng nên bằng -3 + 54 là 51. Dãy "12, 3, 39" ứng với việc lấy 12 làm giá trị mới của a thay vì cộng dồn vào giá trị cũ. Kết luận "Syntax error" không đúng, mọi lệnh đều hợp cú pháp kể cả việc khai hai con trỏ trên một dòng. Kết luận "Runtime error" cũng không, hai con trỏ đều trỏ vào biến cục bộ còn sống nên không có truy cập bất hợp lệ.
236What is required in each C program?4 lựa chọn
AThe program must have at least one function.
BThe program does not require any function.
CInput data
DOutput data
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "The program must have at least one function.". Mọi chương trình C đứng riêng đều phải có hàm main, vì đó là điểm vào mà môi trường gọi tới sau khi nạp chương trình; không có main thì bộ liên kết báo thiếu điểm vào và không tạo nổi tệp chạy. Vậy số hàm tối thiểu của một chương trình là một. Kết luận "The program does not require any function." sai đúng ở chỗ đó: lệnh trong C không thể nằm ngoài thân hàm, ở mức tệp chỉ được khai báo biến, kiểu và hàm. Yêu cầu "Input data" không bắt buộc, một chương trình chỉ tính toán rồi in ra, hoặc thậm chí chẳng làm gì, vẫn hợp lệ. Yêu cầu "Output data" cũng vậy, chương trình có thể chỉ trả mã kết thúc về cho hệ điều hành mà không in ra gì. Hai việc vào ra là nhu cầu của bài toán, còn hàm main là ràng buộc của ngôn ngữ.
237To generate a random integer, you need to declare the ______ library and then you can use the rand() function.4 lựa chọn
A
stdio.hB
stdlib.hC
ctype.hD
conio.hLời giải
Mở trang câu hỏi này →Đáp án đúng: "stdlib.h". Hàm rand cùng với srand và hằng RAND_MAX được chuẩn C xếp vào nhóm tiện ích chung, khai báo trong tệp tiêu đề stdlib.h, nên muốn sinh số nguyên giả ngẫu nhiên thì phải khai báo tệp này; thiếu nó thì trình biên dịch không biết nguyên mẫu của rand nên báo lỗi hoặc sinh mã sai kiểu. Tệp "stdio.h" chỉ giữ phần vào ra có định dạng như printf, scanf và nhóm hàm tệp, không chứa rand. Tệp "ctype.h" giữ nhóm hàm phân loại ký tự như isdigit hay isspace, cũng không liên quan tới số ngẫu nhiên. Tệp "conio.h" không thuộc chuẩn C, nó là tệp riêng của vài trình biên dịch trên hệ điều hành cũ, phục vụ các hàm bàn phím và màn hình kiểu getch, nên vừa không chứa rand vừa không mang theo được sang môi trường khác.
238What is the result displayed on the screen of the following program?4 lựa chọncó code
#include <stdio.h>
void level2(int** ppa)
{
printf("%d\n", **ppa);
}
void level1(int* pa)
{
level2(&pa);
}
main()
{
int a = 10;
level1(&a);
}AThe address of variable a
BThe address of the pointer pa
CThe address of the double pointer ppa
D10
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "10". Biến a mang giá trị 10; lời gọi level1(&a) truyền địa chỉ của a nên tham số pa trỏ tới a. Trong level1, phép lấy địa chỉ của chính tham số pa cho một con trỏ hai cấp, và level2 nhận nó dưới tên ppa. Bỏ một lớp sao thì được lại con trỏ pa, bỏ lớp thứ hai thì lấy nội dung chỗ pa trỏ tới, tức a, nên biểu thức hai lớp sao cho 10 và đặc tả %d in ra số nguyên 10. Kết quả "The address of variable a" ứng với việc chỉ bỏ một lớp sao. Kết quả "The address of the pointer pa" ứng với việc in thẳng ppa mà không bỏ lớp nào. Kết quả "The address of the double pointer ppa" còn cần lấy địa chỉ của ppa, thứ mã này không làm. Thêm nữa, ba kết quả địa chỉ đều lệch kiểu với đặc tả đang dùng: in địa chỉ phải dùng %p, còn %d luôn đọc đối số như một số nguyên.
239What is the output of the following code snippet?4 lựa chọncó code
#include <stdio.h>
int change(int a)
{
a =10;
return a;
}
void main()
{
int i=5;
i = change(i);
printf("%d",i);
}A10
B5
C15
DCompiler error
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "10". Tham số của hàm trong C là một bản sao: lời gọi change(i) đẩy giá trị 5 vào biến cục bộ a, trong thân hàm a bị đặt lại thành 10 rồi trả về 10, còn biến i của hàm chính không hề bị hàm đụng tới. Thứ làm i đổi giá trị là phép gán ở ngoài, vì i = change(i) ghi giá trị trả về vào i, nên lệnh in xuất ra 10. Giá trị "5" là kết quả nếu bỏ phép gán và chỉ gọi change(i) rồi in i, vì khi đó mọi thay đổi chết theo bản sao lúc hàm kết thúc. Giá trị "15" cần một phép cộng dồn, trong khi hàm gán thẳng 10 cho tham số. Kết luận "Compiler error" không đúng: hàm có đầy đủ kiểu trả về và kiểu tham số, giá trị trả về khớp kiểu của i; riêng việc viết void cho hàm chính là không chuẩn nhưng các trình biên dịch quen dùng chỉ cảnh báo chứ vẫn dịch được.
240Suppose there is a function in C as follows:4 lựa chọncó code
double g (double x, double y){
return (x - 2)*(x - 2) + y*y;
}What is the value of z after executing the statement z=g(2,0)?
A0
B4
C2
D8
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "0". Hàm g nhận hai số thực và trả về giá trị của biểu thức (x - 2)*(x - 2) + y*y. Thay x bằng 2 thì x - 2 cho 0 nên tích thứ nhất bằng 0; thay y bằng 0 thì y*y cũng bằng 0; tổng hai phần là 0, và vì kiểu trả về là double nên z nhận 0 ở dạng số thực. Hai đối số viết dưới dạng hằng nguyên nhưng được chuyển ngầm sang double khi truyền vào, nhờ nguyên mẫu hàm đã khai rõ kiểu tham số. Giá trị "4" là kết quả nếu bỏ sót phép trừ, tức tính x*x với x bằng 2. Giá trị "2" chỉ là chính đối số thứ nhất, không phải giá trị của biểu thức. Giá trị "8" không khớp với bất cứ cách thay số nào: với x bằng 2 thì số hạng đầu luôn triệt tiêu và y bằng 0 làm số hạng sau cũng triệt tiêu, muốn có 8 thì biểu thức phải có thêm số hạng khác. Lời gọi hàm chỉ thay giá trị vào tham số rồi tính, không có bước nào khác.