在我的以下代码中:
main(){
int c;
char c1='0';
int x=9-c1;
int y='9'-c1;
}
现在在这个程序中我得到x的值作为一些任意值,但是y的值是0,这是我期望的值。为什么会出现这种差异?
答案 0 :(得分:4)
这是一个很好的解释。只需编译并运行:
#include <stdio.h>
int main(){
int c;
char c1='0';
int x=9-c1;
int y='9'-c1;
printf("--Code and Explanation--\n");
printf("int c;\n");
printf("char c1='0';\n");
printf("int x=9-c1;\n");
printf("int y='9'-c1;\n");
printf("c1 as char '0' has decimal value: %d\n", c1);
printf("decimal 9 - decimal %d or c1 = %d or x\n", c1, x);
printf("char '9' has decimal value %d - decimal %d or c1 = %d\n", '9', c1, y);
printf("Your Welcome :)\n");
return 0;
}
答案 1 :(得分:3)
第一char
是整数。
第二个char
s 可能具有可打印的表示或输出控制功能(例如ASCII:TAB
,CR
,LF
,{{1} },FF
...)取决于使用的字符集。
对于ASCII
BELL
与
相同char c = 'A';
与
相同char c = 65;
另一个广泛使用的字符集是EBCDIC。它使用字符整数值到其可打印/控制表示的不同映射。
在内部始终使用/存储相同的整数值。
可打印,通常但不总是ASCII表示,例如char c = 0x41;
或65
,0x41
,仅在
A
系列打印输出 转换 说明符 printf()
或{{1 }或%s
%c
系列扫描以及 转化 说明符 puts()
或{{1 }或scanf()
%s
或%c
等文字。在所有其他操作中,仅使用fgets()
的整数值。
答案 2 :(得分:2)
当您使用char
进行计算时,您必须记住,你它看起来像'0'或'9',但编译器解释为ASCII值,对于'0'为48,对于'9'为57。
所以当你这样做时:
int x=9-c1;
结果是9 - 48 = -39。而对于
int y='9'-c1;
结果是57 - 48 = 9.
答案 3 :(得分:1)
根据C标准(5.2.1字符集)
- ...在源和执行基本字符集中,的值 上面的十进制数字列表中的每个字符后面的0应为 一个大于前一个的值。
醇>
因此,表达式'9' - '0'
具有与9 - 0
相同的值,并且无论您使用的是ASCII字符表还是EBCDIC,都等于9。
表达式9 - '0'
是实现定义的,取决于您使用的编码表。但无论如何,字符'0'
的内部表示的值大于9
。 (9
是制表符字符表示'\t'
)
例如,在ASCII中,字符'0'
的代码值等于48
。
在EBCDIC中,'0'
的值等于240
。
所以你会得到9 - '0'
是一个负数。
例如,如果字符表示基于ASCII表,则它等于-39
;如果字符表示基于EBCDIC表,则等于-231
。
你可以自己运行这个简单的程序
#include <stdio.h>
int main( void )
{
printf( "%d\n", 9 - '0' );
}
您也可以通过以下方式编写printf语句;)
printf( "%d\n", '\t' - '0' );
因为我提到的9
是转义字符'\t'
(标签)的内部表示的值。