Từ C Programming Language 2nd Edition:C: loại chuyển đổi khi đi qua một cuộc tranh cãi trên một cuộc gọi chức năng
Kể từ khi một cuộc tranh cãi của một cuộc gọi chức năng là một biểu hiện, loại chuyển đổi cũng diễn ra khi đối số được truyền cho chức năng. Trong trường hợp không có một nguyên mẫu hàm, char và short trở thành int, và float trở thành gấp đôi.
Bằng cách đọc văn bản, tôi nhận được ấn tượng rằng trừ khi bạn chỉ định rõ ràng loại đối số bằng cách sử dụng mẫu thử nghiệm hoặc hàm, đối số chức năng sẽ luôn được truyền dưới dạng int hoặc double.
Để xác minh giả thiết của tôi, tôi biên soạn đoạn mã sau:
#include <stdio.h>
main()
{
unsigned char c = 'Z';
float number = 3.14f;
function_call(c, number);
}
void function_call(char c, float f)
{
}
Sau khi biên soạn tôi nhận được những lời cảnh báo sau đây:
typeconversion.c: 11: cảnh báo: mâu thuẫn loại cho ' function_call '
typeconversion.c: 7: warning: khai báo ngầm trước của' function_call 'đã ở đây
Đoán của tôi là c và số được chuyển đổi thành int và double trong lời gọi hàm, và sau đó được chuyển đổi thành char và float. Đây có phải là điều thực sự xảy ra không?
Đây là một câu hỏi hay - và cũng minh họa tại sao điều quan trọng là ** luôn ** có một nguyên mẫu trong phạm vi, với tất cả các thông số khai báo. –