我对下面的代码感到困惑。
#include <stdio.h>
#include <stdlib.h>
int event(char a[],char x,char n);
int main(int argc, char *argv[]) {
int n,y;
char a[40],x;
printf("enter a string\n");
gets (a);
printf("enter the character\n");
x=getche();
printf("\nenter the event\n");
scanf("%d",&n);
y=event(a,x,n);
if(y==0)
printf("%dth event not found\n",n);
else
printf("%dth event is in position:%d",n,y);
getch();
return 0;
}
//*******************************************************
int event(char a[],char x,char n){
int i,cnt=0;
for(i=0;a[i];i++){
if(a[i]==x)
cnt++;
if(cnt==n)
return(i+1);
}
return 0;
}
在函数事件中a [],x,n显示为字符,函数为int,但在main函数 n 和 y 是int,当我们调用event时,我们将它们作为int发送。 当我们调用event.why?代码是否正确时,n,y是不同的?
答案 0 :(得分:3)
整数类型或无范围枚举类型的prvalue可以转换为任何其他整数类型。
http://en.cppreference.com/w/cpp/language/implicit_cast#Integral_conversions
char
的签名是依赖于实现的
Is char signed or unsigned by default?
由于以下原因:
如果目标类型已签名,则如果源整数可以在目标类型中表示,则值不会更改。否则结果是实现定义的。
类型转换的行为特别针对特定于实现。
所以答案可能就是这样。对于n的小值,你可能没问题,但是一旦你遇到截断和签名等等,所有的赌注都会被取消。
答案 1 :(得分:2)
char的范围是-128到127.所以你可以传递一个带有给定范围值的int。如果int的值超出此范围,则会发生溢出并观察到未定义的行为。
知道它是如何工作的 在函数中打印char的值并查看行为。
答案 2 :(得分:0)
在C中,char
不是一个(有点奇怪的)整数类型。在调用函数时,参数之间的隐式转换正在发生,一切都按顺序进行。
这种隐式转换只能很好地工作,因为在使用函数之前,已经提供了原型,因此编译器知道参数必须是什么。
char
使用x
直接向我展示,因为它是一个与a
内容进行比较的实体。对n
我不认为这是个好主意。通常,大小或索引的所有内容都应使用为此类情况提供的语义类型size_t
,无论是main
还是event
。