C中的9-'0'和'9' - '0'有什么区别?

时间:2015-08-08 13:48:00

标签: c

在我的以下代码中:

main(){
    int c;
    char c1='0';
    int x=9-c1;
    int y='9'-c1;
}

现在在这个程序中我得到x的值作为一些任意值,但是y的值是0,这是我期望的值。为什么会出现这种差异?

4 个答案:

答案 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:TABCRLF,{{1} },FF ...)取决于使用的字符集。

对于ASCII

BELL

相同
char c = 'A';

相同
char c = 65;

另一个广泛使用的字符集是EBCDIC。它使用字符整数值到其可打印/控制表示的不同映射。

在内部始终使用/存储相同的整数值。

可打印,通常但不总是ASCII表示,例如char c = 0x41; 650x41,仅在

时使用
  1. 使用A系列打印输出 转换 说明符 printf()或{{1 }或%s
  2. 或使用%c系列扫描以及 转化 说明符 puts()或{{1 }或scanf()
  3. 或编码%s%c等文字。
  4. 在所有其他操作中,仅使用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字符集)

  
      
  1. ...在源和执行基本字符集中,的值   上面的十进制数字列表中的每个字符后面的0应为   一个大于前一个的值。
  2.   

因此,表达式'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'(标签)的内部表示的值。