c语言优先级:C语言的优先性和结合方向



问题

C语言书籍附录都要说个问题就是优先性和结合方向
理解是这些是建立在表达式基础的上个c语言表达式或者看个C语言表达式先看优先性在优先性相同情况下再根据结合方向判断表达式那个部分先运算那个后运算如:
1. a=b=c=0只有个=因此优先性相同因此看结合方向结合方向是从右到左因此整个表达是从右开始计算上面等价和a=(b=(c=0))这是正确地但是下面这个问题该如何解释哪?
2. a=*p;
=,优先级低于*,,也就是等价于a=(*p);但是*p,这个部分是如何运算哪?写过C都知道*先++后可是在C语言附录中*(取地址)是同优先级2级结合方向是从右到左按照这个理解就应该*(p),这才是从右到左吧不知道理解有没有问题但是这个和实际应用相反嘛?





解答

有关a = *p;
首先“后自增”运算符优先级是高于“*”“前自增”才跟“*”平级点楼主没有看仔细
然后为什么优先级高于“*”结果还是取出了原来指针指向内容呢?

有很多书上说“后自增”是先“用”值再加1这种说法是很不严格很不确切正是这种不严格和不确切才导致了许多初学者在*p上绊倒
再看个更简单例子:
i = 10;
j = i;
现在j等于多少?大家都知道是10问原因很多人都会说是“在后自增情况下是先赋值再加1”这中说法完全不负责任赋值运算赋“=”优先级比“后自增”低好几个级别如何可能发生“先赋值”这样事?

正确语义解释是:“前自增”和“后自增”都是先将变量加1然后区别在于加1后返回值后自增在加1后返回是原来而前自增返回是加1后新值
从效果上i相当于个逗号表达式:“tmp = i, i, tmp”

Tags:  c语言 c语言的重要性 c语言运算符优先级 c语言优先级

延伸阅读

最新评论

发表评论