搜索
bottom↓
回复: 24

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

[复制链接]

出0入0汤圆

发表于 2012-3-8 22:22:55 | 显示全部楼层 |阅读模式
void main(void)
{
   int a,b;
   
   a=10;

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

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

}

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

出0入8汤圆

发表于 2012-3-8 23:11:37 | 显示全部楼层
是39吧

出0入0汤圆

发表于 2012-3-8 23:17:58 | 显示全部楼层
这是一道2B题,没有标准答案, 每个编译器都可以不同.
实测:BC31 ,  39
VC6 Debug  : 37
VC6 Release: 39

出0入0汤圆

发表于 2012-3-8 23:24:07 | 显示全部楼层
11 12 13=36

出0入0汤圆

 楼主| 发表于 2012-3-9 07:52:56 | 显示全部楼层
二楼正解,但是能知道原因不?标准C 啊,怎么能随编译器而变呢

出0入0汤圆

发表于 2012-3-9 08:11:47 | 显示全部楼层
回复【4楼】ngyg12 酸菜鱼
-----------------------------------------------------------------------

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

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

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

出0入0汤圆

发表于 2012-3-9 08:28:34 | 显示全部楼层
依赖于实现。。也就是和编译器有关。这样的问题没有研究的价值。懂汇编的话,你就知道不同编译环境对这种情况的优化处理是不同的。

出0入93汤圆

发表于 2012-3-9 08:31:26 | 显示全部楼层
回复【4楼】ngyg12  酸菜鱼
二楼正解,但是能知道原因不?标准c 啊,怎么能随编译器而变呢
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2012-3-9 08:43:30 | 显示全部楼层
回复【7楼】takashiki 岚月影
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2012-3-9 08:53:12 | 显示全部楼层
又是一个与编译器 有关系的程序 很纠结啊

出0入54汤圆

发表于 2012-3-9 09:00:58 | 显示全部楼层
这样的语句在程序里写出来是会挨骂的

出0入0汤圆

发表于 2012-3-9 09:16:45 | 显示全部楼层
回复【4楼】ngyg12 酸菜鱼
-----------------------------------------------------------------------
这种情况并没有写入C标准的。只是规定了:依赖于具体实现!。

出0入0汤圆

发表于 2012-3-9 09:22:13 | 显示全部楼层
应该避免使用这样的写法。否则程序移植的时候可能就麻烦了。

出0入0汤圆

发表于 2012-3-9 09:22:52 | 显示全部楼层
不要操之过急  一步一步来啊  就不会错了 只不过是多两行程序吧了

出0入0汤圆

发表于 2012-3-9 09:37:03 | 显示全部楼层
同十楼。。写这种代码必定挨骂。
--接6楼。。举两款编译器的例子对照。
KeilC51:
测试C程序:

#include <reg52.h>
void main(void)
{
   char  a,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
              DJNZ  R0,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!

出0入131汤圆

发表于 2012-3-9 09:51:16 | 显示全部楼层
也就是考试出这种变态题目了。实际上根本不需要。

出0入0汤圆

 楼主| 发表于 2012-3-9 11:07:52 | 显示全部楼层
回复【15楼】asj1989
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2012-3-9 12:00:48 | 显示全部楼层
现代教育的悲哀!


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

出0入0汤圆

 楼主| 发表于 2012-3-9 13:59:23 | 显示全部楼层
回复【17楼】chinabn GonBoy
-----------------------------------------------------------------------

哎,这年头就这样啊!

出0入30汤圆

发表于 2012-3-9 16:48:19 | 显示全部楼层
要谁敢在项目中这样写,轻则被批,重则被炒。也只有所谓的计算机考试会出这样的题了。

出0入0汤圆

发表于 2012-4-12 13:23:44 | 显示全部楼层
写程序还是规矩点好啊呵呵

出0入0汤圆

发表于 2012-4-13 08:30:20 | 显示全部楼层
这要看不同的编译器!Win-tc编译结果39

出0入0汤圆

发表于 2012-4-13 08:44:59 | 显示全部楼层
本帖最后由 无级电工 于 2012-4-13 08:47 编辑

TC 实测:39

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

出0入4汤圆

发表于 2012-4-13 09:00:09 | 显示全部楼层
这样的题,真不晓得有啥子意义

出0入0汤圆

发表于 2012-8-24 14:25:59 | 显示全部楼层
真是个阴魂不散的蛋疼题目啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 06:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表