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”

时间: 2024-11-08 22:23:59

C语言的优先性和结合方向的相关文章

演化架构与紧急设计: 语言、表达性与设计

简介:发现和积累惯用模式的能力对于紧急设计至关重要.对于设计而言同样十分重要的是代码的表 达性.在本系列文章的第 2 部分中,Neal Ford 将继续讨论表达性和模式的交集,通过惯用模式和正式 设计模式阐释这些概念.他用动态语言为 JVM 重构了一些经典的四人组(Gang of Four)模式,以说明 表达性更好的语言如何使您看到被透明度不佳的语言遮挡的设计元素. 本文是本系列文章的第 2 部分,旨在演示计算机语言的表达性(允许您专注于本质,而不是形式)对 于紧急设计的重要作用.意图(inte

Java语言单态创立性模式介绍

什么是模式 一个围棋下得好的人知道,好的"形"对于围棋非常重要.形是棋子在棋盘上的几何形状的抽象化.形就是模式(Pattern),也是人脑把握和认识外界的关键.而人脑对处理模式的能力也非常高超, 人可以在几百张面孔中一下子辨认出所熟悉的脸来,就是一个例子. 简而言之,在我们处理大量问题时,在很多不同的问题中重复出现的一种性质,它使得我们可以使用一种方法来描述问题实质并用本质上相同,但细节永不会重复的方法去解决,这种性质就叫模式.模式化过程是把问 题抽象化,在忽略掉不重要的细节后,发现问

柯里化的前生今世(三):语言和同像性

按照故事情节的正常发展,我们这一篇该介绍Racket语言的语法了. 可是,在大局观上,我们还没有达成共识. 对于一个概念来说,我们不止要学会怎样描述它,还要学会理解它的内涵. 因此,这篇还是在打基础,俗称,引言.. 关于 在上一篇中,我们提到了Lisp语言家族,看到了关于Lisp最美丽的传说,我们提到了Racket,以及它的IDE,DrRacket. 本文将从目标语言和元语言,同像性(Homoiconicity),引用等这些角度来深入的讨论Lisp, 浅尝辄止,毕竟不是一个好习惯. 目标语言和元

(一一一)存储持续性、作用域和链接性

在之前,说过自动存储(随函数内声明而建立,函数消亡而消亡).静态存储(全局都存在).动态存储(一般是用new).   但是,涉及到多文件的时候,存储类别如何影响信息在文件间的共享.   C++使用三种(C++11使用4种)不同的方案来存储数据,这些方案的区别就在于数据保留在内存中的时间.   自动存储持续性:在函数定义中声明的变量(包括函数参数)的存储持续性是自动的.它们在程序开始执行其所属的函数或者代码块时被创建,在执行完函数或代码块时,它们使用的内存被释放.C++有两种存储持续性为自动的变量

自动化出生干工程的,现在想当程序员,大家建议我学习哪一种语言?

问题描述 RT,在国企呆了一年多,准备再过一年就撤,正在寻找出路,如果再不跳出来,估计以后就只有在国企混了.比较来说:在这国企,做工程的,累还是累的,但是法定节假日和周六周日是有的(当然忙的时候必须加班,或者平时没事的时候也主动加班蹭加班),工资待遇不说很高,但是对于刚毕业的人来说确实是可以.比起大的IT或者互联网公司来说,自然就不行了,也没有你们累.在国企,深山老林的地方,待遇好点是必须的,但是长久不长也是神坑.现在想安稳点,少出点差,定下来,所以想写程序,毕竟也是自动化出身,学过C/C++的

IE浏览器的语言显示问题

一.将语言新增到 Internet Explorer 1. 开启 Internet Explorere,单击浏览器右上角的 [工具] 按钮,选择 [Internet 选项]. 2. 切换到 [常规] 标签页,点击 [语言]. 3. 在 [语言首选项] 视窗中,点击 [添加]. 4. 在 [添加语言] 中,从列表中选取语言,再单击 [确定]. 电脑常识 5. 将语言新增到 Internet Explorer. 6. 如果有多个语言,可透过 [上移] 和 [下移] 按钮,对语言进行优先顺序排列,当网

让你的网站首页自动选择语言

    过去在一家软件外企工作时写过一个小的web实验性项目,其中一部分需求是用户界面的多种语言(简体中文.繁体中文.英语.朝鲜语.日语)支持,当时使用了模板技术来实现了该需求,并用Cookies保存了用户的设置,但是用户第一次登陆时(或者是将Cookies删除了以后)仍然需要选择语言种类,那么能不能更方便用户呢?能不能用程序来自动帮助选择呢?     答案是肯定的,大家都在用google,你用中文系统打开google的首页,打开的自然是中文首页,而不会是其他语言.因为google会自动判断用户

php实现首页自动选择语言转跳

很多网站在首页上做一些链接,让用户来选择将要访问的各自的语言页面,让中国人选择"中文",韩国人选择"朝鲜语",等等.那么能不能做程序来自动帮助选择呢?答案是肯定的,大家都在用google,你用中文系统打开google的首页,打开的自然是中文首页,而不会是其他语言.因为google会自动判断用户系统使用的首选语言是什么.怎样才能做到像google那样呢,其实很简单,在浏览器发给web服务器的 HTTP Headers Information 中包含了这样一个信息 Ac

《C语言解惑》一导读

前言 C语言解惑 C语言并不大--如果以参考手册的篇幅作为衡量标准的话,C语言甚至可以归为一种"小"语言.不过,这种"小"并不意味着C语言的功能不够强大,而是说明了C语言里的限制性规则比较少.C语言本身的设计非常简洁精妙,这一点相信C语言的使用者早已有所体会. 不过,C语言的这种精妙对C语言的初学者来说,似乎是故作神秘.因为限制较少,C语言可以写成内容丰富的表达式,这可能会被初学者认为是输出错误.C语言的紧凑性允许以简洁凝炼的方式实现常见的编程任务. 学用C语言的过