一个有关函数调用的问题

第一次使用 格式不是很规范 请大神见谅!

#include<stdio.h>
viod f(char a){
     int x;
         x=a-1;
        printf("%d",x);
}
int main(){
    int n;
        scanf("%d",&n);
        f(n);
}

在主函数里面f(x)传入的x应该为char型,为什么传入的是int型
依然能调用函数?

这是一个利用堆栈十进制转换m进制的程序,

#include<stdio.h>
#include"实验5头文件.h"
void conversion(ElemType n,int m){//十进制数 n转换为m进制 
    SequenceStack myStack;
    StackInitiate(&myStack);
    while(n){
        StackPush(&myStack,n%m);   //将余数压进堆栈
        n/=m; 
    }
    while(StackNotEmpty(&myStack)==1){
        StackPop(&myStack,&n);
        printf("%d",n);
    }
}

int main(){
    int n,m;
    printf("请输入一个十进制数:"); 
    scanf("%d",&n);
    printf("该数要转换为几进制得数:");
    scanf("%d",&m);
    printf("转换后的数值为:");
    conversion(n,m);
}

附下头文件

#include <stdio.h>
#define MaxStackSize 50
typedef char ElemType;
typedef struct 
{
    ElemType stack[MaxStackSize];
    int top;
} SequenceStack;

void StackInitiate(SequenceStack *S){
    S->top=0;
    return;
}

int StackPush(SequenceStack *S,ElemType x){//将元素x压入堆栈 
    if(S->top>=MaxStackSize){
        printf("堆栈已满无法插入!");
        return 0;
    }
    else{
        S->stack[S->top]=x;
        S->top++;
        return 1;      //入栈成功 
    }
}

int StackPop(SequenceStack *S,ElemType *d){//出栈 
    if(S->top<=0){
    printf("堆栈已空无法出栈!");
    return 0;
    }
    else{
        S->top--;
        *d=S->stack[S->top];
        return 1;
    }
}

int StackTop(SequenceStack *S,ElemType *d){ //取栈顶元素 
    if(S->top<=0){
        printf("堆栈已空!");
        return 0;
    }
    else{
        *d=S->stack[S->top-1];
        return 1;
    }
}

int StackNotEmpty(SequenceStack *S){//判断堆栈是否非空 
    if(S->top<=0)
    return 0;//空栈返回0
    else
    return 1;//非空栈返回1 
}

图片说明

此处的ElemType在头文件中定义的是char型,而且StackPush(SequenceStack *S,ElemType x),StackPop(SequenceStack *S,ElemType *d),x,d也是char型,但是在主函数里传入的是int型,程序依然能正常运行。
不懂为什么???

C语言:赋值时进行类型转换。赋值运算符右边的值需要转换为左边变量的类型,左边变量的类型即赋值表达式结果的类型。
传值参数,也有赋值过程。
当把较长的整数转换为较短的整数或 char 类型时,超出的高位部分将被丢弃。
以上。

c语言就是这样的,int直接传入char,不作任何检查。如果你用java或者别的什么语言,不要吃惊,c语言就是简陋到如此地步,一种数组下标都不检查,字符串没有长度靠结束符号结尾的语言,你对它有什么指望。

隐式类型转换,计算机背后将int4字节截断为char1字节。c语言是编程语言的起源,刚开始的思想是把一切放心地交给程序员,所以才不会做类型检查。后面的思想是程序员是不可信任的,所以后面的语言才会对程序源进行限制,比如类型检查等。