| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2420 人关注过本帖
标题:自增运算符和数组下标的先后顺序
只看楼主 加入收藏
mscool
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2013-5-9
结帖率:92.31%
收藏
已结贴  问题点数:20 回复次数:6 
自增运算符和数组下标的先后顺序
arr[t++] = 4;
arr[++t] = 4;
这两个语句也是遵循以下原则的:
++x ;自增后使用。
x++ :使用后再自增

可是,这都表明了:自增运算符的优先级大于数组下标[],这合理吗?我见过下面一段话:
后缀运算符,包括数组取下标[]、函数调用()、结构体取成员.、指向结构体的指针取成员->、后缀自增++、后缀自减--。如果一个操作数后面有多个后缀,按照离操作数从近到远的顺序(也就是从左到右)依次运算,比如 a.name++ ,先算 a.name ,再++,这里的 .name 应该看成 a 的一个后缀,而不是把 . 看成双目运算符。
单目运算符,包括前缀自增++、前缀自减--、 sizeof 、类型转换()、取地址运算&、指针间接寻址*、正号+、负号-、按位取反~、逻辑非! 。如果一个操作数前面有多个前缀,按照离操作数从近到远的顺序(也就是从右到左)依次运算,比如 !~a ,先算 ~a ,再求!。

求大神给出一个合理的逻辑,我乱了。。。
搜索更多相关主题的帖子: 结构体 优先级 
2015-07-02 11:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
无语……

授人以渔,不授人以鱼。
2015-07-02 11:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:5 
神了

++x ;自增后使用。
x++ :使用后再自增
不怪你,你被一些似是而非的邪书给害了,跟我念:
  在C中++x这个表达式的值为原先x的值+1,副作用是x的值增加了1;(C++中不是这样定义的,不管它)
  在C中x++这个表达式的值为原先x的值,副作用是x的值增加了1。
即记住几个词 表达式表达式求值副作用
抛弃所谓的“先”和“后”,重要的事说两遍:C/C++语言真的没有规定这里有先和后
另外,这两个表达式的值是左值,表达式求值后跟x已经没有关系了。

这都表明了:自增运算符的优先级大于数组下标[]
怎么得出这个逻辑的?这里根本就丝毫不涉及到运算符的优先级。
对于 arr[t++] 这个复合表达式而言,当然要先计算子表达式t++。
即记住几个词 复合表达式子表达式

我见过下面一段话:……
看的东西还不少,可惜都是童话。
在给你几个词,你自己上网搜一下:C语言运算符优先级结合方向
2015-07-02 13:08
mscool
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2013-5-9
收藏
得分:0 
回复 3楼 rjsp
谢谢,我还是第一次听说复合表达式和子表达式,这里就是我困惑的核心。
2015-07-02 15:56
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:5 
程序代码:
#include<stdio.h>

int main()
{
    int x=10;
    int c;
    c=(++x);
    printf("c=%d   x=%d\n",c,x); //vs下测试  c=11   x=11
    int y=10;
    int d;
    d=(y++);
    printf("d=%d   y=%d\n",d,y); //vs下测试  d=10   y=11
    return 0;
}

DO IT YOURSELF !
2015-07-02 16:56
夜沐
Rank: 2
等 级:论坛游民
帖 子:14
专家分:10
注 册:2015-6-30
收藏
得分:5 
表达式里的子表达式就和集合中子集性质一样的。运算符与操作数在为更大表达式的一部分时候要注意用法。()>++
2015-07-02 17:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用mscool在2015-7-2 15:56:34的发言:

谢谢,我还是第一次听说复合表达式和子表达式,这里就是我困惑的核心。

核心不是你第一次听说和不懂这些概念,而是意识形态不良。那种不良的意识形态就是以为把代码都挤在一行上是能耐、把语句和表达式弄复杂了是本事。写代码,第一要求是正确,第二要求是清晰,两者的相辅相成的。你的那些代码,本来可以写成更清晰的两行,但偏偏要显能耐,写到一行上,自己又没把握,结果是自找麻烦。通常的忠告是:当你没把握的时候,改用有把握的方案,而不是硬来,先实现正确实现意图,再考虑所谓的“优化”。

现代的编译器都是优化编译器,把代码分拆成多行,编译器也有能力、而且是更有能力执行优化编译,它会自动构建出优化的可执行代码,不用你自己写出晦涩难懂但却无正确性把握的“优化”源代码。绝大多数程序员,都不会比编译器更了解如何优化代码——你有那个本事,不用在这里混了。

授人以渔,不授人以鱼。
2015-07-03 08:55
快速回复:自增运算符和数组下标的先后顺序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017723 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved