免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4930 | 回复: 13
打印 上一主题 下一主题

[C] *号到底是左结合的还是右结合的? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-04 10:19 |只看该作者 |倒序浏览
例如,

  1. int main()
  2. {
  3.         int i = 1;
  4.         int* p, q;
  5.         p = &i;
  6.         //q = &i;//q不是指针
  7.         int* buf[20];//数组的每个元素都是int*
  8.         return 0;
  9. }
复制代码
第二行声明里面,*好象是右结合的,也就是p是一个*,指向int,而q是普通的int
第五行声明里面,*好象是左结合的,也就是buf是一个数组,有20个元素,每个元素都是int*

那我就不明白了,*号有没有确定的左右结合律呢?
还请指点

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
2 [报告]
发表于 2016-07-04 11:00 |只看该作者
我每次都是一行只声明一个变量。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
3 [报告]
发表于 2016-07-04 11:15 |只看该作者
K&R当年写parser的时候要么是偷懒要么就是脑抽了一下,这么多年过去了还是有人想要试图理解这脑抽背后是不是有什么深意……
我家楼下也有两棵法国梧桐啊。

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
4 [报告]
发表于 2016-07-04 11:52 |只看该作者
*作指针操作时是右结合
*作乘法操作时是左结合,其优先级低于指针操作的*
[]是左结合,且优先级高于所有的*

论坛徽章:
0
5 [报告]
发表于 2016-07-04 15:54 |只看该作者
这是一元运算符,哪有左右结合之说?
在二元运算符里,只有赋值类是右结合,如  =  +=  -= *= /=

形如

int  * a [ N ]

只是谁【先】结合的问题,是 *优先还是 [ 优先,这是运算符优先级比较的问题。
按规定,*优先。

        


论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
6 [报告]
发表于 2016-07-12 11:24 |只看该作者
声明里的 */[] 算是operator么?

论坛徽章:
223
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:10操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
7 [报告]
发表于 2016-07-12 11:45 来自手机 |只看该作者
楼主在看编译原理,反正你又不研究编译器

纠结什么啊

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
8 [报告]
发表于 2016-07-14 10:49 |只看该作者
回复 6# nswcfd


找到一句话,不知道是否可以作为依据?姑且记录一下。

6.7.6 Declarators

Syntax

   declarator:
      pointer/opt direct-declarator
   
   direct-declarator:
      identifier
      ( declarator )
      direct-declarator [ type-qualifier-list/opt assignment-expression/opt ]
      direct-declarator ( parameter-type-list )
      ...

   pointer:
      * type-qualifier-list/opt
      * type-qualifier-list/opt pointer

Semantics

2 Each declarator declares one identifier, and asserts that when an operand of the same
  form
as the declarator appears in an expression
, it designates a function or object with the
  scope, storage duration, and type indicated by the declaration specifiers.

不知道是不是可以理解为,尽管声明不是(?)表达式,但是可以按照“同样形式”的表达式来解析,
也就是说,可以利用表达式的操作符优先级,来判断标识符具体代表什么(普通object,指针,数组,函数等)。

例如,对于如下的声明,static int (*a)[10];
其中declartion specifier是static int,declarator是(*a)[10],
按照expression的规则去解析(*a)[10],要求a是一个指针,并且(*a)是个数组,那么a就是一个指向数组的指针。

言外之意,解析declator和解析表达式的逻辑/代码是重用的?

---------------------------------------------------------------------

注,这里主要用到的expression规则为:

primary-expression:
   identifier
   constant
   ( expression )
   ...

postfix-expression:
   primary-expression
   postfix-expression [ expression ]
   postfix-expression ( argument-expression-list/opt )
   ...

unary-expression:
   postfix-expression
   unary-operator cast-expression
   ...

unary-operator:
   *
   ...

cast-express到assignment-expression,略

expression:
   expression , assignment-expression
   ...

(*a)[10]的解析结果为
expression
   -> assignment-expression -> ...
      -> postfix-expression [ expression ]
         -> ( expresion ) [ expression ] -> ...
            -> ( unary-operator cast-expression) [ expression ]
               -> ( * cast-expresion ) [ expression ] -> ...
                  -> ( * identifier ) [ expression ]
                     -> ( * a ) [ expression ] -> ...
                        -> ( * a ) [ primary-expression ]
                           -> ( * a ) [ constant ]
                              -> ( * a ) [ 10 ]

评分

参与人数 1信誉积分 +10 收起 理由
cdsfiui + 10 很给力!

查看全部评分

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
9 [报告]
发表于 2016-07-15 12:01 |只看该作者
对,声明中的运算符与表达式中含义有所不同,但优先级与结合性是一致的

论坛徽章:
10
CU大牛徽章
日期:2013-09-18 15:20:48程序设计版块每日发帖之星
日期:2016-07-21 06:20:00IT运维版块每日发帖之星
日期:2015-07-30 09:40:01技术图书徽章
日期:2014-10-14 16:00:43天蝎座
日期:2013-09-27 17:41:29CU大牛徽章
日期:2013-09-18 15:21:17CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:20:58每日论坛发贴之星
日期:2016-07-21 06:20:00
10 [报告]
发表于 2016-07-18 16:10 |只看该作者
这里*不是运算符,哪来左结合右结合?

int  * a, p  ;  指明一个是指针,一个是变量

int * b [5] ; 指明一个指针数组,这里还能怎么个结合法?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP