第一次使用 格式不是很规范 请大神见谅!
#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语言是编程语言的起源,刚开始的思想是把一切放心地交给程序员,所以才不会做类型检查。后面的思想是程序员是不可信任的,所以后面的语言才会对程序源进行限制,比如类型检查等。