A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我的基础测试中有个题目这样的
#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.
所以这题目有两种答案

8 个回复

倒序浏览
这是C语言,你就按照C语言的做不就行了。
回复 使用道具 举报
恩,不同编译器编译顺序不一样,有的从右到左,有的从左到右吧,我记得大学有说过;

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

13是从哪种方式来分析的?麻烦帮忙分析下,难道是有的编译器后++不是在语句结束后执行+1的?
13的话我感觉只有赋值前就把后++给+1了才会出现啊
回复 使用道具 举报
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
回复 使用道具 举报
正解:7  12
回复 使用道具 举报
为什么Ubuntu和CentOS是13  7  可以给解释一下吗?
回复 使用道具 举报
从右往左应该是7和12吧
回复 使用道具 举报
这个区分系统和编译器,   搞IOS  当然在Xcode上,不必纠结一些不必要东西
回复 使用道具 举报
应该是7和12吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马