星海's Blog

老头初学编程
漫谈C语言及如何学习C语言(转)

初学C编程(1)

星海 posted @ 2010年10月20日 07:44 in C学习 , 1593 阅读

a+++++b这个表达式如何理解?应该理解成a++ ++ +b还是a++ + ++b,还是a + ++ ++b呢?应该按第一种方式理解。编译的过程分为词法解析和语法解析两个阶段,在词法解析阶段,编译器总是从前到后找最长的合法Token。把这个表达式从前到后解析,变量名a是一个Token,a后面有两个以上的+号,在C语言中一个+号是合法的Token(可以是加法运算符或正号),两个+号也是合法的Token(可以是自增运算符),根据最长匹配原则,编译器绝不会止步于一个+号,而一定会把两个+号当作一个Token。再往后解析仍然有两个以上的+号,所以又是一个++运算符。再往后解析只剩一个+号了,是加法运算符。再往后解析是变量名b。词法解析之后进入下一阶段语法解析,a是一个表达式,表达式++还是表达式,表达式再++还是表达式,表达式再+b还是表达式,语法上没有问题。最后编译器会做一些基本的语义分析,这时就有问题了,++运算符要求操作数能做左值,a能做左值所以a++没问题,但表达式a++的值只能做右值,不能再++了,所以最终编译器会报错。

C语言中的声明(Declaration)有变量声明,函数声明和类型声明三种。如果一个变量或函数的声明要求编译器为它分配存储空间,那么也可以称为定义(Defintion),因此定义是声明的一种。 

变量的定义和赋值也可以一步完成,这称为变量的初始化(Initialization)。

 

表达式左边所表示的存储位置称为左值。

改变计算机存储单元里的数据或者做输入输出操作都算Side Effect。

局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式初始化。

C99规定,如果a和b是整形,b不等于0,则表达式(a/b)*b+a%b总是等于a。%运算符的结果总是与被除数同号(想一想为什么)。

case后面的必须是整型常量表达式。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter