Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用int变量作为char变量可以吗?_C_Char_Int - Fatal编程技术网

使用int变量作为char变量可以吗?

使用int变量作为char变量可以吗?,c,char,int,C,Char,Int,所以我的问题是为什么有些人使用int变量作为char变量。 例 提前感谢这- scanf("%c",&i); 传递了错误的参数(%c需要字符地址)。它调用了未定义的行为。此- scanf("%c",&i); 传递了错误的参数(%c需要字符的地址)。它调用了未定义的行为。c的char是整数类型。它的(数字)值通常用于表示字符,但这是另一回事 您可以安全地使用int类型的变量来保存char类型范围内的值。您可以将char分配给int或将char传递给需要int的函数,既不需要强制

所以我的问题是为什么有些人使用int变量作为char变量。 例

提前感谢

这-

scanf("%c",&i);
传递了错误的参数(
%c
需要字符地址)。它调用了未定义的行为。

此-

scanf("%c",&i);

传递了错误的参数(
%c
需要字符的地址)。它调用了未定义的行为。

c的
char
是整数类型。它的(数字)值通常用于表示字符,但这是另一回事

您可以安全地使用
int
类型的变量来保存
char
类型范围内的值。您可以将
char
分配给
int
或将
char
传递给需要int的函数,既不需要强制转换,也不需要更改值

在某些地方,故意使用
int
而不是
char
来表示字符。典型的例子可能是标准库的
getc()
fgetc()
getchar()
函数,除了所有可能的
char
值之外,它们还需要
int
的范围来表示
EOF
。此外,出于历史原因,一些其他函数声明
int
参数以接受预期为
char
类型的数据
memset()
是其中一个比较有名的

另一方面,指向
int
char
的指针是不可互换的。正如其他人所指出的,您的
scanf()
调用为此产生了未定义的行为


一般来说,应该使用
char
而不是
int
来表示字符数据,除非有很好的外部驱动原因(例如需要处理
getchar()
的返回值)。更一般地说,正确匹配数据类型,仔细考虑允许在何处执行类型转换。

C的
char
是一种整数类型。它的(数字)值通常用于表示字符,但这是另一回事

您可以安全地使用
int
类型的变量来保存
char
类型范围内的值。您可以将
char
分配给
int
或将
char
传递给需要int的函数,既不需要强制转换,也不需要更改值

在某些地方,故意使用
int
而不是
char
来表示字符。典型的例子可能是标准库的
getc()
fgetc()
getchar()
函数,除了所有可能的
char
值之外,它们还需要
int
的范围来表示
EOF
。此外,出于历史原因,一些其他函数声明
int
参数以接受预期为
char
类型的数据
memset()
是其中一个比较有名的

另一方面,指向
int
char
的指针是不可互换的。正如其他人所指出的,您的
scanf()
调用为此产生了未定义的行为


一般来说,应该使用
char
而不是
int
来表示字符数据,除非有很好的外部驱动原因(例如需要处理
getchar()
的返回值)。更一般地说,正确匹配数据类型,仔细考虑允许在何处执行类型转换是错误的。所以
printf(“%c”,i)无法获得可移植结果。您是否尝试过您的代码?在线编译器说它不正常:@mch此代码在编译时带有警告,如果没有
-Werror
标志集。请始终启用编译器警告!“但它对我有效”并不意味着它在任何情况下都会有效,甚至在第二次通话中也不会。请考虑未定义行为的含义
scanf(“%c”、&i)是错误的。所以
printf(“%c”,i)无法获得可移植结果。您是否尝试过您的代码?在线编译器说它不正常:@mch此代码在编译时带有警告,如果没有
-Werror
标志集。请始终启用编译器警告!“但它对我有效”并不意味着它在任何情况下都会有效,甚至在第二次通话中也不会。请思考未定义的含义behaviour@lol只需使用标志
-Wall-Werror
编译它,看看你得到了什么。如果
char
保证小于或等于
int
(大部分小于),为什么它是UB?您将收到一个警告,但您将有足够的内存空间来存储它。从
scanf
的角度来看,它是错误的,它正在等待一个
char*
,并且得到一个
int*
@EnzoFerber,我只在
scanf
的上下文中说UB。如果传递了错误的参数,将导致它。@lol和正确的输出,你知道如果有UB,你可以得到任何东西。@EnzoFerber,对于
printf()
这个问题可以解释,但是,请参阅和类似的问题和答案,以讨论其中的一些问题。@lol只需使用标志
-Wall-Werror
编译它,然后看看您得到了什么。如果
char
保证小于或等于
int
(大部分小于),为什么它是UB?您将收到一个警告,但您将有足够的内存空间来存储它。从
scanf
的角度来看,它是错误的,它正在等待一个
char*
,并且得到一个
int*
@EnzoFerber,我只在
scanf
的上下文中说UB。如果传递了错误的参数,则会导致此问题。@lol和正确的输出,您知道如果有UB,您可以得到任何东西。@EnzoFerber,对于
printf()
,此问题可以解释,但有关某些问题的讨论,请参阅和类似的问题和答案。