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++上绊倒。
再看一个更简朴的例子:
int i = 10;
int j = i++;
此刻j便是几多?各人都知道是10,问原因,许多人城市说是“在后自增的环境下,是先赋值再加1”。这中说法完全不认真任,赋值运算赋“=”的优先级比“后自增”低好几个级别,怎么大概产生“先赋值”这样的事?
正确的语义表明是:“前自增”和“后自增”都是先将变量加1,然后区别在于加1后返回值,后自增在加1后返回的是本来的,而前自增返回的是加1后新值。
从结果上,i++相当于一个逗号表达式:“tmp = i, ++i, tmp”