ngyg12 发表于 2012-3-8 22:22:55

一个C语言指针自加问题,求答案

void main(void)
{
   int a,b;
   
   a=10;

   b = (++a) + (++a) + (++a);

printf("%d\n",b);

}

呃,被整昏了,这个b输出应该是好多啊?怎么算的呢..?

lindabell 发表于 2012-3-8 23:11:37

是39吧

shark 发表于 2012-3-8 23:17:58

这是一道2B题,没有标准答案, 每个编译器都可以不同.
实测:BC31 ,39
VC6 Debug: 37
VC6 Release: 39

seaman117 发表于 2012-3-8 23:24:07

11 12 13=36

ngyg12 发表于 2012-3-9 07:52:56

二楼正解,但是能知道原因不?标准C 啊,怎么能随编译器而变呢

jiege0119 发表于 2012-3-9 08:11:47

回复【4楼】ngyg12 酸菜鱼
-----------------------------------------------------------------------

不同的答案是因为编译器的执行顺序不同;

得出39的顺序应该是:
    ++a;
    ++a;
    ++a;
    b = a + a + a;

得出37的顺序应该是:
    b = ((++a) + (++a)) + (++a);

Alimy 发表于 2012-3-9 08:28:34

依赖于实现。。也就是和编译器有关。这样的问题没有研究的价值。懂汇编的话,你就知道不同编译环境对这种情况的优化处理是不同的。

takashiki 发表于 2012-3-9 08:31:26

回复【4楼】ngyg12酸菜鱼
二楼正解,但是能知道原因不?标准c 啊,怎么能随编译器而变呢
-----------------------------------------------------------------------

是标准C,但是你看了C语言的限制么?挑战编译器么?我一直认为,玩弄编译器的后果往往是自己被编译器玩弄,还是老老实实的写规矩的程序吧。
C语言规定:一个序列点的变量只允许被改变一次,除此以外的所有情况结果都是不确定的。详情请谷歌“C语言 副作用”。
因此,即使结果是31你也没有什么好抱怨的。

ngyg12 发表于 2012-3-9 08:43:30

回复【7楼】takashiki 岚月影
-----------------------------------------------------------------------

哦,这样的啊!我去看看,多谢指教!

Name_006 发表于 2012-3-9 08:53:12

又是一个与编译器 有关系的程序 很纠结啊

lusson 发表于 2012-3-9 09:00:58

这样的语句在程序里写出来是会挨骂的

avrstm32 发表于 2012-3-9 09:16:45

回复【4楼】ngyg12 酸菜鱼
-----------------------------------------------------------------------
这种情况并没有写入C标准的。只是规定了:依赖于具体实现!。

avrstm32 发表于 2012-3-9 09:22:13

应该避免使用这样的写法。否则程序移植的时候可能就麻烦了。

anvy178 发表于 2012-3-9 09:22:52

不要操之过急一步一步来啊就不会错了 只不过是多两行程序吧了

Alimy 发表于 2012-3-9 09:37:03

同十楼。。写这种代码必定挨骂。
--接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!

asj1989 发表于 2012-3-9 09:51:16

也就是考试出这种变态题目了。实际上根本不需要。

ngyg12 发表于 2012-3-9 11:07:52

回复【15楼】asj1989
-----------------------------------------------------------------------

恩,就是同学考2级看书有这样的题,网上视频解答是是39,但VC6是37,不同编译器不同 answer ,所以贴出来问问了.

chinabn 发表于 2012-3-9 12:00:48

现代教育的悲哀!


成天告诉你那个是错的。 不会告诉你那个是对的。
成天沉溺于这种 老学究式的写法

ngyg12 发表于 2012-3-9 13:59:23

回复【17楼】chinabn GonBoy
-----------------------------------------------------------------------

哎,这年头就这样啊!

lovelywwei 发表于 2012-3-9 16:48:19

要谁敢在项目中这样写,轻则被批,重则被炒。也只有所谓的计算机考试会出这样的题了。

唯诚hhw2 发表于 2012-4-12 13:23:44

写程序还是规矩点好啊呵呵

Lee2012 发表于 2012-4-13 08:30:20

这要看不同的编译器!Win-tc编译结果39

无级电工 发表于 2012-4-13 08:44:59

本帖最后由 无级电工 于 2012-4-13 08:47 编辑

TC 实测:39

这是孔乙己编的软件。呵呵。

cwei 发表于 2012-4-13 09:00:09

这样的题,真不晓得有啥子意义

zhaomzs 发表于 2012-8-24 14:25:59

真是个阴魂不散的蛋疼题目啊{:huffy:}
页: [1]
查看完整版本: 一个C语言指针自加问题,求答案