使用int变量作为char变量可以吗?
所以我的问题是为什么有些人使用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的函数,既不需要强制
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()
,此问题可以解释,但有关某些问题的讨论,请参阅和类似的问题和答案。