一个C语言指针自加问题,求答案
void main(void){
int a,b;
a=10;
b = (++a) + (++a) + (++a);
printf("%d\n",b);
}
呃,被整昏了,这个b输出应该是好多啊?怎么算的呢..? 是39吧 这是一道2B题,没有标准答案, 每个编译器都可以不同.
实测:BC31 ,39
VC6 Debug: 37
VC6 Release: 39 11 12 13=36 二楼正解,但是能知道原因不?标准C 啊,怎么能随编译器而变呢 回复【4楼】ngyg12 酸菜鱼
-----------------------------------------------------------------------
不同的答案是因为编译器的执行顺序不同;
得出39的顺序应该是:
++a;
++a;
++a;
b = a + a + a;
得出37的顺序应该是:
b = ((++a) + (++a)) + (++a); 依赖于实现。。也就是和编译器有关。这样的问题没有研究的价值。懂汇编的话,你就知道不同编译环境对这种情况的优化处理是不同的。 回复【4楼】ngyg12酸菜鱼
二楼正解,但是能知道原因不?标准c 啊,怎么能随编译器而变呢
-----------------------------------------------------------------------
是标准C,但是你看了C语言的限制么?挑战编译器么?我一直认为,玩弄编译器的后果往往是自己被编译器玩弄,还是老老实实的写规矩的程序吧。
C语言规定:一个序列点的变量只允许被改变一次,除此以外的所有情况结果都是不确定的。详情请谷歌“C语言 副作用”。
因此,即使结果是31你也没有什么好抱怨的。 回复【7楼】takashiki 岚月影
-----------------------------------------------------------------------
哦,这样的啊!我去看看,多谢指教! 又是一个与编译器 有关系的程序 很纠结啊 这样的语句在程序里写出来是会挨骂的 回复【4楼】ngyg12 酸菜鱼
-----------------------------------------------------------------------
这种情况并没有写入C标准的。只是规定了:依赖于具体实现!。 应该避免使用这样的写法。否则程序移植的时候可能就麻烦了。 不要操之过急一步一步来啊就不会错了 只不过是多两行程序吧了 同十楼。。写这种代码必定挨骂。
--接6楼。。举两款编译器的例子对照。
KeilC51:
测试C程序:
#include <reg52.h>
void main(void)
{
chara,b;
a=10;
b = (++a) + (++a) + (++a);
P1 = b;
}
disassembly:
Q0000: LJMP_Start ;0000 02 00 10
_Main: MOV R7,#0AH ;0003 7F 0A a=10
INC R7 ;0005 0F a++a=0x0b
INC R7 ;0006 0F a++a=0x0c
MOV A,#0CH ;0007 74 0C (A)=0x0c
ADD A,#0BH ;0009 24 0B (A)=0x0b +0x0c
INC R7 ;000B 0F a++ a=0x0d
ADD A,R7 ;000C 2F (A)=(A)+0x0d
MOV P1,A ;000D F5 90
RET ;000F 22
_Start: MOV R0,#7FH ;0010 78 7F
CLR A ;0012 E4
_Init: MOV @R0,A ;0013 F6
DJNZR0,Q0013 ;0014 D8 FD
MOV SP,#07H ;0016 75 81 07
LJMP_Main ;0019 02 00 03
结果是 b=0x0b+0x0c+0x0d=0x24(36D)
TC2.0下测试。
测试C程序:
void main(void)
{
int a,b;
a=10;
b = (++a) + (++a) + (++a);
printf("%d\n",b);
}
disassbmly:
push si
push di ;保护寄存器
mov si, 0Ah ;a=10
inc si ;a++
inc si ;a++
inc si ;a++ a=0x0d
mov di, si ;(di)=0x0d
add di, si
add di, si ;b=0x0d +0x0d +0x0d =39d
push di
mov ax, 194h;pointer -> "%d\n"
push ax ; format
call _printf
pop cx
pop cx
pop di
pop si
retn
这里的结果是39..
以后不要写这种不利于移植的代码。Over! 也就是考试出这种变态题目了。实际上根本不需要。 回复【15楼】asj1989
-----------------------------------------------------------------------
恩,就是同学考2级看书有这样的题,网上视频解答是是39,但VC6是37,不同编译器不同 answer ,所以贴出来问问了. 现代教育的悲哀!
成天告诉你那个是错的。 不会告诉你那个是对的。
成天沉溺于这种 老学究式的写法 回复【17楼】chinabn GonBoy
-----------------------------------------------------------------------
哎,这年头就这样啊! 要谁敢在项目中这样写,轻则被批,重则被炒。也只有所谓的计算机考试会出这样的题了。 写程序还是规矩点好啊呵呵 这要看不同的编译器!Win-tc编译结果39 本帖最后由 无级电工 于 2012-4-13 08:47 编辑
TC 实测:39
这是孔乙己编的软件。呵呵。
这样的题,真不晓得有啥子意义 真是个阴魂不散的蛋疼题目啊{:huffy:}
页:
[1]