#include <stdio.h>
main()
{
printf(" %d\n",'-'-'-'+'/'/'/');
}
其输出为1
。
我也尝试了不同的组合,但不能解决 输出?
答案 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