@
bwangel 逗号的功能不一定是“分隔语句”。
首先你得了解,C的语法中逗号并不都是一回事。有些逗号只是标点而不是操作符,如函数调用的postfix-expreesion中的分隔参数的逗号;而逗号表达式里的逗号操作符是另一回事。
最重要的影响语义的差异之一是,前者不限定求值顺序,而后者会插入一个sequence point。这里没有这个坑,但不知道迟早被坑。
语句之间是有sequence point的。从这个意义上来看,逗号操作符可以认为是在“分隔语句”。虽然实际上更像是个应付语句可用性缺陷设计的workaround(嘛,while条件里塞不进语句咋办……用逗号擦屁股吧)。而其它逗号,就显然不是这个意思。
printf("%d %d\n",(num=100,1),num);这坨里面,本来分号之前按postfix-expression来看,里面的逗号是argument-expression-list的组成部分——用于分隔作为参数assignment-expression的硬编码的分隔符而不是逗号操作符,但这里硬加了个括号,而作为argument的assignment-expression当然没法包括没配对的括号,语法分析就只能把(num=100,1)当作整个assignment-expression,然后继续规约:conditional-expression→...→primary-expression→( expression )→expression , assignment-expression——这里面的逗号就是逗号操作符了。
这里的要点是语法规则决定了assignment-expression的逗号不会被作为操作符,而加上括号以后括号里面的东西可以不是assignment-expression而是允许包含逗号操作符的一般expression,因此加上括号以后含义就变了。