以下程序的输出是什么?

时间:2013-12-30 18:58:48

标签: c printf

#include <stdio.h>

main()
{
   printf(" %d\n",'-'-'-'+'/'/'/');
}

其输出为1

我也尝试了不同的组合,但不能解决 输出?

5 个答案:

答案 0 :(得分:5)

字符常量'-'的ASCII值为45,而'/'的ASCII值为47.因此,假设您在使用ASCII或UTF-8字符编码的系统上运行,则表达式求值为

'-' - '-' + '/' / '/'  == 45 - 45 + 47 / 47 == 0 + 1 == 1

因此输出“1”。

修改

KerrekSB正确地指出底层字符集不必是ASCII;我只是用它来指出字符常量具有相应的数值。无论编码(ASCII,EBCDIC,UTF-8等)如何,'-' - '-'将始终评估为0,'/' / '/'将始终评估为1.

答案 1 :(得分:3)

'-'-'-'+'/'/'/'

'-'-'-' = ascii(-) - ascii(-) = 0

'/'/'/' = ascii(/) / ascii(/) = 1

因此1。

答案 2 :(得分:2)

字符- /被替换为ASCII码并被操纵,因为它们是整数。所以'-' - '-' == 0'/' / '/' == 1因此输出为1

'-'-'-'+'/'/'/' == 45 - 45 + 47 / 47

所以你的表达式相当于:

printf(" %d\n",45 - 45 + 47 / 47); // prints 1

答案 3 :(得分:1)

gcc -S printf1.c; cat printf1.s

    .file   "printf1.c"
    .section    .rodata
.LC0:
    .string " %d\n"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $1, %esi
    movl    $.LC0, %edi
    movl    $0, %eax
    call    printf
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Debian 4.8.2-10) 4.8.2"
    .section    .note.GNU-stack,"",@progbits

我的结论是'-'-' - '+'/'/'/'被编译器静态评估为'1'(movl $ 1,%esi)。

可以通过

确认
#include <stdio.h>

main()
{
  int i=0;
  for (i=0; i< 10; i ++)
    {
      printf(" %d\n",'-'-'-'+'/'/'/' + i);
    }
}

答案 4 :(得分:1)

字符文字只是整数值,所以你有一个简单的整数算术表达式:

'-' - '-' + '/' / '/'

通过C中通常的表达式评估规则,并考虑到一个除以它自己的数是1,这等于'-' - '-' + 1,即0 + 1,它只是1