黑马程序员技术交流社区

标题: 基础测试的填空题存在多解 [打印本页]

作者: alanwangke213    时间: 2015-8-3 13:30
标题: 基础测试的填空题存在多解
我的基础测试中有个题目这样的
#include<stdio.h>

int mian(void){
    int a =5;
    int b;
    b = (++a)+(a++);
    printf("%d  %d"a,b);
    return 0;
}

可是结果却存在两种,一种是12  7,一种是13  7.我是做底层的,我的ubuntu  和 CentOS都是13  7.可是用C的理解却是12  7.
所以这题目有两种答案

作者: Eil.tea    时间: 2015-8-3 14:08
这是C语言,你就按照C语言的做不就行了。
作者: wowthe1st    时间: 2015-8-3 15:03
恩,不同编译器编译顺序不一样,有的从右到左,有的从左到右吧,我记得大学有说过;

不过这样来说的话,两种答案不是应该要么7 12(从左往右) 要么 7 11(右到左)么?

13是从哪种方式来分析的?麻烦帮忙分析下,难道是有的编译器后++不是在语句结束后执行+1的?
13的话我感觉只有赋值前就把后++给+1了才会出现啊
作者: alanwangke213    时间: 2015-8-3 17:06
wowthe1st 发表于 2015-8-3 15:03
恩,不同编译器编译顺序不一样,有的从右到左,有的从左到右吧,我记得大学有说过;

不过这样来说的话,两 ...

有的编译器版本会有这个现象:
表达式b = (++a)+(a++);中前面括号和后面括号分别为两个运算
++a和a++的运算描述是在语句执行前和语句执行后分别自加1;
编译器从左到右
ldr  r0 ,#5          ;将r0存放a的值
ldr  r1 ,#0         ;将r1存放b的值,不一定是0,初始值假设为0
add r0,r0 ,#1        ;++a
//而(a++)的括号里面是一个a ++;的运算。
‘(’入栈
mov r2 ,r0           ;a的值存在r2中  也就是6
‘)’出栈
add r0 ,r0 ,#1            ; 执行后++
mov r2,r0             ;将r0付给r2
add r1 ,r0 , r2            ; r1 = 6 + 7 =13
作者: 馒头爱财    时间: 2015-8-3 17:28
正解:7  12
作者: 魔尊    时间: 2015-8-3 18:20
为什么Ubuntu和CentOS是13  7  可以给解释一下吗?
作者: QQ2544    时间: 2015-8-3 20:04
从右往左应该是7和12吧
作者: Northcity    时间: 2015-8-3 21:10
这个区分系统和编译器,   搞IOS  当然在Xcode上,不必纠结一些不必要东西
作者: 阿伦666    时间: 2015-8-3 22:05
应该是7和12吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2