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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© z82454642 中级黑马   /  2014-2-24 16:15  /  2022 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 z82454642 于 2014-3-11 23:34 编辑

#include <stdio.h>
int main(int argc, const char * argv[])
{
    int b;
    int a = 5;
    b = (++a) + (a++);
   
    printf("b=%d, a=%d\n", b, a);
    return 0;
}

这段代码编译的时候会有一个警告
warning: multiple unsequenced modifications to 'a' [-Wunsequenced]
    b = (++a) + (a++);

这个是因为什么啊?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1 很给力!

查看全部评分

6 个回复

倒序浏览
其实这样写,不同的编译器处理是不同的,但是基本上应该是从表达式的右边一直往左结合计算,先算a++表达式值为5,a为6,之后算++a,此时应该是7,算出来结果是5+7=12

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
chay0103 发表于 2014-2-25 20:26
其实这样写,不同的编译器处理是不同的,但是基本上应该是从表达式的右边一直往左结合计算,先算a++表达式 ...

- -好纠结的说啊·····能分析下下面的程序为什么会是这个结果吗?
int a = 6;
b=(a++)+(++a);
printf("---b1=%d\n",b);
a = 6;
b=(a++)+(a++)+(++a);
printf("---b2=%d\n",b);输出结果····我什么会这样子··


第二个多了个 a++;居然才比第一个大了5?!!!?有点无法理解··

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
chay0103 发表于 2014-2-25 20:26
其实这样写,不同的编译器处理是不同的,但是基本上应该是从表达式的右边一直往左结合计算,先算a++表达式 ...

b = (++a) + (a++); 这一行应该是从左到右计算,先是++a,a=6,然后再加6,结果b=12,运算结束了a才等于7吧

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 z82454642 于 2014-2-26 23:01 编辑
脸皮猴 发表于 2014-2-26 15:07
- -好纠结的说啊·····能分析下下面的程序为什么会是这个结果吗?
int a = 6;
b=(a++)+(++a);

我用你的代码试了下输出结果是
---b1=14
---b2=22
这道题就是一个优先级的问题
int a = 6;
b=(a++)+(++a); // 这行b=6+8
printf("---b1=%d\n",b);
a = 6;
b=(a++)+(a++)+(++a);//这行等于6+7+9
printf("---b2=%d\n",b)

回复 使用道具 举报
++是左结合的,意思就是先完成++左边的元算
回复 使用道具 举报
z82454642 发表于 2014-2-26 22:46
我用你的代码试了下输出结果是
---b1=14
---b2=22

那说明·不同的编译器可能得出的结果不同咯?我知道这个a++和++a的区别,但是像我列出的程序那样子的情况·这种··真是得看编译器了··
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马