c语言字符常量中如何判断右值是常量还是变量

左值_百度百科
左值(lvalue) 是//等中的一类。“左”(left)的原意是指可以放在赋值符号“=”的左边,但其实也表示能作为&和++等的(B语言中已经如此)。而且,现代C/C++中的含义已经不局限于此。lvalue的l被重新解释为location。这也对应于ISO C11/ISO 的内存位置(memory location)。
左值可以表示对象,即具有对应的可以由用户访问的(应特别注意和类风格中的对象——的实例的区别;等语言的对象即使用此种说法;C的左值相当于Java中的“变量”[1]
)。正因为如此,用于取得对象的指针的内建&要求是左值。
左值表示存储在计算机内存的对象,与此相对的概念是(rvalue),习惯上统称为左值性(lvalue-ness) 。
的左值和右值是中的元素[2]
。而ISO C/C++的左值和右值独立于语法,是纯粹上的概念。此外,ISO C在脚注中约定右值就是值[3]
,但ISO 中右值和值是两个明确独立的概念[4]
ISO C允许不是左值也不作为右值(即具有值)的表达式——函数指示符(function designator) ——也就是单独的函数名。它通过转换得到值。
ISO C++03规定表达式必须是左值或之一。而在ISO 中,左值性被正式地扩充为更复杂的值类别(value category) :左值是返左值(glvalue, &generic lvalue&) 的一类,后者和纯右值(prvalue, &pure rvalue&) 相对。纯右值相当于之前版本的右值,此外还有消亡值(xvalue, &eXpired value&) 。函数名作为表达式在C++中是左值。
ISO C/C++中,左值可以进一步分为可以修改的左值(modifiable lvalue) 和不可修改的左值。只有可修改的左值才能作为的左。不可修改的左值的一类例子是具有类型的左值。
注意左值可能表示对象。左值和并无特定关联,ISO C99(以及之后的3个技术修正案)在此的定义有误,在ISO C11被修正。
左值和常量并不一定有必然的固定关联。常量在C语言中是语法元素,和C的字符串字面量(string literal)一起,对应于的(literal) 。作为常量表达式,它可以是左值(如C++的字符串字面量,习惯上也被称为——尽管C的字符串字面量严格地不是常量),也可以是非左值(C的常量或C++的其它字面量)。注意这里的常量比数学中使用的通常意义上的概念严格得多,也不和变量直接相对。
可以出现在特定的中的一些需要是左值,如赋值(左操作数)、一元&、++和--。此外,sizeof、alignof等操作数中可以出现左值,且不会发生以下提到的左值到非左值的转换。
左值参与决定转换规则。除了需要左值的上下文,左值可以转换为非左值。数组名和函数名作为表达式除了表示其本身,可以转换为对应指针。这些在C中lvalue conversion、array conversion和function conversion[3]
,对应于C++的lvalue-to-rvalue conversion、array-to-pointer conversion和function-to-pointer conversion[4]
。后两者习惯上称为退化(decay) ,在参数时尤其明显。这三个转换是C++的标准转换(standard conversion)的子集,因为其左值转换成的共性(注意函数名作为表达式在C++也是左值),在规则中被称为左值变换(lvalue transformation) [4]
The Java(TM) Language Specification - Java SE 7 Edition
Ken Thompson.Users' Reference to B:Bell Labs,1972
ISO/IEC(E)
ISO/IEC(E)(C语言课件)第4部分 常量 变量和数组_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
(C语言课件)第4部分 常量 变量和数组
C​语​言​课​件
大小:565.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢C语言&变量操作总结
------------------------------
|Doc Name |&&& C
Variables&& |
------------------------------
&| Version
0.0.7&&&&&&
------------------------------
Yuhui&&&&&
------------------------------
05.09.2009&& |
------------------------------
&变量操作总结
&============
01. 基本概念
1.01& 标识符
01. 用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有有效字符序列称为标识符(identifier)。
1.02& 常量
1.2.01& 定义
&&&&&&&&&&&&&&&&&
常量的意思就是不可改变的量,是一个常数。
1.2.02& 常量的种类
&&&&&&&&&&&&&&&&&
01. 整数、浮点数、字符、字符串、转义字符、枚举型。
1.03& 变量
1.3.01& 定义
&&&&&&&&&&&&&&&&&
其值可以改变的量称为变量。
1.3.02& 变量的种类
&&&&&&&&&&&&&&&&&&
01. 整型、浮点型、字符型、数组型、指针型、结构体型、共用体型。
1.3.03& 变量名
&&&&&&&&&&&&&&&&&
1.3.3.01& 定义
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据;
&&&&&&&&&&&&&&&&&
1.3.3.02& 变量名命名规则
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 由字母、数字和下划线组成;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 必须以字母或下划线打头;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
03. 前31个字符有效;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
04. 字母区分大小写。
&&&&&&&&&&&&&&&&&&&&&&&&&&&
注意:这里的命名规则指的是能通过编译器检查;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
面试:会有的。
&&&&&&&&&&&&&&&&&
1.3.3.03& 先定义后使用
&&&&&&&&&&&&&&&&&&&&&&&&&&&
在c语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用”,这样做的目的是:
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。例如,如果在定义部分写了
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
而在执行语句中错写成 staent。如:staent = 30;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
在编译时检查出 statent
未经定义,不作为变量名。因此输出“变量statent未经声明”的信息,便于用户发现错误,避免变量名使用时出错。
&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。如指定a、b为int型,turbo
c编译系统为a和b各分配两个字节,并按整数方式存储数据。
&&&&&&&&&&&&&&&&&&&&&&&&&&&
指定每一变量属于一个类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。例如,整型变量a和b,可以进行求余运算:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
% 是“求余”,得到a/b的余数。如果将a、b指定为实型变量,则不允许进行“求余”运算,在编译时会给出有关“出错信息”。
1.04& Programming Example
1.4.01& 查看下面的标识符是否合法?
&&&&&&&&&&&&&&&&&
w2888, Abraham, C LANGUAGE, gogo, main, __0__, woyao$, 66r,
Jeremiah, count_sec, temp%min
02. 数据类型和大小
2.01& 整型
Basic integer data type.
2.1.01& 进制表示形式
&&&&&&&&&&&&&&&&&
整数一般有:二进制、八进制、十进制、十六进制表示形式。
&&&&&&&&&&&&&&&&&
2.1.1.01& 二进制
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 二进制是逢2进位的进位制;0、1是基本算符;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
数学家冯·诺依曼提出了在计算机中使用二进制,还有其他的方面,比如程序存储,控制器与运算器分离等,使得研制工作顺利完成;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
03. 电脑是用电来工作的,而电的高低电平刚好是两种状态,二进制的0和1正是用来表示这种状态的最好的方式;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
04. 数据在内存中是以二进制形式存放的。
&&&&&&&&&&&&&&&&&
2.1.1.02& 八进制
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 八进制以0开头;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 八进制数采用 0~7这八数来表达一个数,八进制就是逢8进1;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
03. 八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方。
&&&&&&&&&&&&&&&&&
2.1.1.03& 十进制
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 十进制,直接书写数值。
&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 十进制数采用 0~9这十数来表达一个数,十进制就是逢10进1。
&&&&&&&&&&&&&&&&&
2.1.1.04& 十六进制
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 十六进制以0x开头;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 十六进制数采用 0~F这十六数来表达一个数,十六进制就是逢十六进1;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
03. 十六进制的16个数是:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F。
&&&&&&&&&&&&&&&&&
2.1.1.05& 后缀
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 在计算机应用中,字母加在数据的后面来标识是何进制;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 二进制使用后缀b表示;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
03. 十进制使用后缀d表示;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
04. 八进制用Q表示;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
05. 十六制使用后缀H表示。
&&&&&&&&&&&&&&&&&
2.1.1.06& 进制转换
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 进制之间转换以二进制8421为基础进行换算:如:0xC0为十进制192,八进制的300。
&&&&&&&&&&&&&&&&&
2.1.1.07& 面试
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 这些进制转换在面试中是会有的;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 这些在实际工作是可以用计算器来算的,不过这些是基础原理搞得清清楚楚。
2.1.02& 码制表示形式
&&&&&&&&&&&&&&&&&
数值有三种码制表示方式:原码、反码、补码。
&&&&&&&&&&&&&&&&&
2.1.2.01& 原码
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 原码就是数值的二进制码;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 原码是给人看的,按照我们的理解而存在着;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
03. 原码反过来又等于补码的反码加1;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
04. 在补码与原码的转换中理解人与计算机的交流。
&&&&&&&&&&&&&&&&&
2.1.2.01& 反码
&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 反码就是数值的二进制码取反;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 反码是为了求补码而引出的概念;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
03. 正数的反码就是数值本身;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
04. 求反码原则:最高位为符号位,求反时符号位不变,其它各位按位去翻转;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
05. 反码和求取反是两个概念:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
~:按位取反
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1按位取反是:-2
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
取反后 (补码,计算机识别)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
求原码:-2
&&&&&&&&&&&&&&&&&
2.1.2.01& 补码
&&&&&&&&&&&&&&&&&&&&&&&&&&&
2.1.2.1.01& 定义
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 一个正数的补码和其原码的形式相同;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 负数的补码是该数的绝对值的二进制形式按位取反,再加1;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
03. 计算机存储的是补码,计算机只认补码,按照补码形式计算;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
04. 所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。
&&&&&&&&&&&&&&&&&&&&&&&&&&&
2.1.2.1.02& 补码的设计目的
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. 使符号位能与有效值部分一起参加运算,从而简化运算规则;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
02. 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
&&&&&&&&&&&&&&&&&&&&&&&&&&&
2.1.2.1.03& 计算原则
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
计算机与补码关联,按照补码形式计算;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-1&&& 1000
0001(原码)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-2&&& 1000
0010(原码)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-1 (反码)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-2 (反码)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
补码形式如下:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
=&&&&&&&&&
(补码形式,给机器看的)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
转换成原码为: = -3(十进制)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 (10) - 1 (10) = 1 (10) + -1 (10) = 0 (10)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
() 补 + () 补 = ( )补 = 0&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 (10) - 2 (10) = 1 (10) + -2 (10) = -1 (10)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
() 补 + () 补 = () 补 = -1 正确
&&&&&&&&&&&&&&&&&&&&&&&&&&&
2.1.2.1.04& 注意事项
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
01. (-128)没有相对应的原码和反码,(-128) = ()。
&&&&&&&&&&
2.1.03& 类型
&&&&&&&&&&&&&&&&&
有五种:基本整型int,短整型short,长整型long,有符号signed,无符号unsigned。
&&&&&&&&&&&&&&&&&
01. 基本整型int:默认为有符号的,32位机器上占4个字节;
&&&&&&&&&&&&&&&&&&&&&
有符号整型表示范围为:-2的31次方~2的31次方-1,也就是:- ~ ;
&&&&&&&&&&&&&&&&&&&&&
无符号整型表示范围为:2的32次-1,也就是:0 ~ 。
&&&&&&&&&&&&&&&&&
02. 短整型short:默认为有符号的,32位机器上占2个字节;
&&&&&&&&&&&&&&&&&&&&&
有符号整型表示范围为:-2的15次方~2的15次方-1,也就是:-32768 ~ 32767;
&&&&&&&&&&&&&&&&&&&&&
无符号整型表示范围为:2的16次-1,也就是:0 ~ 65535。
&&&&&&&&&&&&&&&&&
03. 长整型long:默认为有符号的,32位机器上占4个字节;
&&&&&&&&&&&&&&&&&&&&&
有符号整型表示范围为:-2的31次方~2的31次方-1,也就是:- ~ ;
&&&&&&&&&&&&&&&&&&&&&
无符号整型表示范围为:2的32次-1,也就是:0 ~ 。
&&&&&&&&&&&&&&&&&
04. 类型默认
&&&&&&&&&&&&&&&&&&&&&
01. int就是singed int;
&&&&&&&&&&&&&&&&&&&&&
02. unsigned int就是unsigned;
&&&&&&&&&&&&&&&&&&&&&
03. short就是singed short int;
&&&&&&&&&&&&&&&&&&&&&
04. unsigned short就是unsinged short int;
&&&&&&&&&&&&&&&&&&&&&
05. long就是singed long int;
&&&&&&&&&&&&&&&&&&&&&
06. unsigned long就是unsinged long int;
&&&&&&&&&&&&&&&&&&&&&
07. singed是默认的,一般不写。
2.1.04& 类型指定
&&&&&&&&&&&&&&&&&
01. 一个整常量后面加一个字母u或U,认为是unsigned int型;
&&&&&&&&&&&&&&&&&
02. 一个整常量后面加一个字母l或L,认为是long int型。
2.1.05& 数据溢出
&&&&&&&&&&&&&&&&
01. 表示范围超出的话,超出的范围是不确定的;
&&&&&&&&&&&&&&&&
02. 两个整数相除的结果为整数,采取向零取整的方法,如:5/3=1,-5/3=-1,取整后向零靠拢。
2.1.06& 强制类型转换
&&&&&&&&&&&&&&&&
01. 可以利用强制类型转换运算符将一个表达式转换成所需类型;
&&&&&&&&&&&&&&&&
02. 形式为:(类型名)(表达式)。
2.02& 浮点型
The keyword float usually represents a single precision floating
point data type, and double represents a double precision floating
point data type.
2.2.01& 两种表示形式
&&&&&&&&&&&&&&&&&
01. 十进制小数形式,用数字和小数点组成。如:.123,123.0;
&&&&&&&&&&&&&&&&&
02. 指数形式,如:123e3或123E3为123X10的3次方。字母e之间必须有数字,且e后的指数必须为整数;
&&&&&&&&&&&&&&&&&
03. 规范化指数形式:在字母e之前的小数部分中,小数点左边应只有一位非零数字。
2.2.02& 存储
&&&&&&&&&&&&&&&&&
01. 浮点型数据是按照指数形式存储的;
&&&&&&&&&&&&&&&&&
02. 系统把一个浮点型数据分成小数部分和指数部分,分别存入小数部分采用规范化的指数方式表示;
&&&&&&&&&&&&&&&&&
03. 究竟用多少位来表示小数部分,多少位来表示指数部分,标准C无具体规定,由各编译系统自定;
&&&&&&&&&&&&&&&&&
04. 小数部分占的位越多数的有效数字越多,精度越高;指数部分占的越多,能表示的数值范围越大。
2.2.03& 浮点型变量的分类
&&&&&&&&&&&&&&&&&
01. float:32位机器上占:4个字节,有效数字:6 ~ 7,数值范围:-3.4*10的-38次方 ~
3.4*10的38次方;
&&&&&&&&&&&&&&&&&
02. double:32位机器上占:8个字节,有效数字:15 ~ 16,数值范围:-1.7*10的-308次方 ~
1.7*10的308次方;
&&&&&&&&&&&&&&&&&
03. long double:32位机器上占:12个字节,有效数字:18 ~ 19,数值范围:-1.2*10的-4936次方 ~
1.2*10的4936次方。
2.2.04& 浮点型数据操作
&&&&&&&&&&&&&&&&&
01. 避免一个很大的数和一个很小的数相加或相减,否则会丢失小的数。如e5 +
20,结果是:.000000,而不是我们期待的:.000000;
&&&&&&&&&&&&&&&&&
02. 1.0 / 3 * 3的结果不会是1;
&&&&&&&&&&&&&&&&&
03. C编译系统将浮点型常量作为双精度来处理,精度高了运算速度低了。在数字后面加字母f或F,系统会按单精度处理;
&&&&&&&&&&&&&&&&&
04. 双精度变量负值给单精度变量时可能溢出。
2.03& 字符型
Basic characterdata type. Variables of type char are 1 byte in
They can be signed (this is the default, unless you use the
compiler option 'unsigned char') or unsigned,
which means they have a range of -128 to 127 and 0 to 255.
C的字符常量是用单撇号括起来的一个字符。
2.3.01& 转义字符
&&&&&&&&&&&&&&&&&
01. \n:& 换行
&&&&&&&&&&&&&&&&&
02. \t:& 水平制表,跳到下一个tab位置,一般8位
&&&&&&&&&&&&&&&&&
03. \b:& 退格,将当前位置移到前一列
&&&&&&&&&&&&&&&&&
04. \r:& 回车,将当前位置移到本行开头
&&&&&&&&&&&&&&&&&
05. \a:& 响铃
&&&&&&&&&&&&&&&&&
06. \\:& 反斜杠字符“\”
&&&&&&&&&&&&&&&&&
07. \':& 单撇号字符'
&&&&&&&&&&&&&&&&&
08. \":& 双撇号字符"
&&&&&&&&&&&&&&&&&
09. \ddd:1到3位8进制所代表的字符
&&&&&&&&&&&&&&&&&
10. \xhh:1到2位16进制所代表的字符
&&&&&&&&&&&&&&&&&
11. \0:& 字符串结束标志
&&&&&&&&&&&&&&&&&
12. \f:& 换页符(FF)
2.3.02& 字符变量
&&&&&&&&&&&&&&&&&
将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中;
&&&&&&&&&&&&&&&&&
02. 字符数据与整型数据可以互相赋值;
&&&&&&&&&&&&&&&&&
03. 'a'的ASCII值是97,'A'的ASCII值是65,大写字母转换成小写字母为减去32。
2.3.03& 字符串常量
&&&&&&&&&&&&&&&&&
01. 字符串常量是一对双撇号括起来的字符序列;
&&&&&&&&&&&&&&&&&
02. 不能把字符串赋给一个字符变量;
&&&&&&&&&&&&&&&&&
03. 字符串结束标志为'\0';
&&&&&&&&&&&&&&&&&
04. '\0'是一个ASCII码为0的字符,是空操作字符,它不引起任何控制动作,也不是一个可显示的字符。
2.3.04& 陷阱
&&&&&&&&&&&&&&&&&
01. char 也是一种普通的 scalable 类型,除了字长之外,它与 short,int,long
这些类型没有本质区别,只不过被大家习惯用来表示字符和字符串而已;
&&&&&&&&&&&&&&&&&
02. 或许当年该把这个类型叫做“byte”,然后现在就可以根据实际情况,使用 byte 或 short 来把 char 通过
typedef 定义出来,这样更合适些。
2.04& 类型转换、精度提升
2.05& 溢出
03. 运算符和表达式
3.01& 赋值运算符
01. 赋值语句的作用是把某个常量或变量或表达式的值赋值给另一个变量;
02. 符号为‘=’,如:PI = 3.;
03. 这里并不是等于的意思,只是赋值;
04. 赋值语句左边的变量在程序的其他地方必须要声明;
05. 赋值运算符是右结合。
3.02& 左值、右值
得已赋值的变量我们称为左值,因为它们出现在赋值语句的左边;产生值的表达式我们称为右值,因为她它们出现在赋值语句的右边。
02. 常数只能作为右值。
3.03& 优先级
01. 运算符计算时都有一定的顺序,就好象先要算乘除后算加减一样;
02. 优先级和结合性是运算符两个重要的特性,要全面的考虑;(面试中考的机率还是有的)
编程时要查优先级和结合性的总表来分析,最好的办法是没把握时加括号来处理,因为括号是优先级最高的,不要怕难看,最清晰、直观、准确。
3.04& 结合方向、运算顺序
01. 结合性又称为计算顺序,它决定组成表达式的各个部分是否参与计算以及什么时候计算;
02. 结合性有自左向右的和自右向左的两种,左结合、右结合。
3.05& 算术运算符
3.5.01& 单目运算符
&&&&&&&&&&&&&&&&&
01. C语言中的运算对象如果是一个,则称单目运算,对应的操作符称为单目运算符;
&&&&&&&&&&&&&&&&&
02. +(单目取正),-(单目取负),++(自增),--(自减);
&&&&&&&&&&&&&&&&&
03. +,-在单目运算和双目运算中意思是不一样的,单目运算中是:+(取正),-(取负);
&&&&&&&&&&&&&&&&&
04. 单目减运算符相当于取相反值,若是正值就变为负值,若是负数就变为正值。单目加运算符没有意义,纯粹是和单目减构成一对用的。
3.5.02& 双目运算
&&&&&&&&&&&&&&&&&
01. C语言中的运算对象如果是两个,则为双目运算,对应的操作符称为双目运算符;
&&&&&&&&&&&&&&&&&
02. +(加法),-(减法),*(乘法),/(除法),%(取余或称取模);
&&&&&&&&&&&&&&&&&
03. +、-在单目运算和双目运算中意思是不一样的,双目运算中是:+(加),-(减)。
3.06& 复合算术运算符
01. 在赋值运算符“=”之前加上其他运算符,可以构成复合的运算符。
02. a += 3; 相当于a = a + 3; x *= y + 8; 相当于x = x * (y + 8);
03. 在=右边包含若干项的表达式,则相当于它有括号;
04. 复全算术运算符有:+=, -=, *=, /=, %=;
04. 采用复合运算符,一是简化程序,二是提高编译效率,这种写法与“逆波兰”式一致,能产生质量较高的目标代码。
3.06& 复合位运算符
01. 复合位运算符有:=, |=, ^=, &&= ,
3.07& 逻辑运算符
01. 其实在C语言中的逻辑值没有所谓的真值和假值,非0为真值,0为假值;
02. 逻辑运算符是根据表达式的值来返回真值或假值;
03. 逻辑运算符包包括下列几个运算符:&&(逻辑与),
||(逻辑或), !(逻辑非);
逻辑与(&&)运算时,只要有一个为假,总的表达式就为假,只有当所有都为真时,总的式子才为真;
05. 逻辑或(||)运算时,只要有一个为真,总的值就为真,只有当所有的都为假时,总的式子才为假;
逻辑非(!)运算是把相应的变量数据转换为相应的真、假值。若原先为假,则逻辑非以后为真,若原先为真,则逻辑非以后为假;
07. 还有一点很重要,当一个逻辑表达式的后一部分的取值不会影响整个表达式的值时,后一部分就不会进行运算了;称为短路原则。
3.08& 关系运算符
关系运算符中的“关系”二字的含义是指一个数据与另一个数据之间的关系,这种关系只有成立与不成立两种可能情况,用逻辑值来表示;
02. 逻辑上的真与假时用数字“1”与“0”来表示的;关系成立时表达式的结果为真(1),否则表达式的结果为假(0);
02. 关系运算符包括下列几个运算符:&(大于), &=(大于等于),
&(小于), &=(小于等于), ==(等于), !=(不等于)。
3.09& 自增,自减运算符
3.9.01& Descriptions
&&&&&&&&&&&&&&&&&
01. ++i, --i:在使用i之前,先使i的值加、减1;
&&&&&&&&&&&&&&&&&
02. i++, i--:在使用i之后,使i的值加、减1;
3.9.02& Experience
&&&&&&&&&&&&&&&&&
01. 自增运算符++,自减运算符--,只能用于变量;
&&&&&&&&&&&&&&&&&
02. 自增运算符++,自减运算符--,结合方向是“自右至左”;
&&&&&&&&&&&&&&&&&
02. 自增运算符++,自减运算符--,都是单目运算符。
3.9.03& Programming Example
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
下面的代码段中,执行之后i 和j 的值是什么? ( )
&&&&&&&&&&&&&&&&&
int i = 1;
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
下列程序片段输出的是什么?
&&&&&&&&&&&&&&&&&
int b = 1;
&&&&&&&&&&&&&&&&&
if (a = b)
&&&&&&&&&&&&&&&&&&&&&&&&&
printf("%d\n", +a);
条件运算符
3.11.01& 定义
&&&&&&&&&&&&&&&&&&
条件运算符(?:)是C语言中唯一的一个三目运算符,它是对第一个表达式作真、假检测,然后根据结果返回两外两个表达式中的一个。
3.11.02& 格式
&&&&&&&&&&&&&&&&&&
&表达式1&?&表达式2&:&表达式3&
3.11.03& 说明
&&&&&&&&&&&&&&&&&&
计算过程是:计算&表达式1&的值,如果为真(非0),则计算&表达式2&的值,并将&表达式2&的值作为整个条件表达式的结果值;如果为假(0),则计算&表达式3&的值,并将&表达式3&的值作为整个条件表达式的结果值。
&&&&&&&&&&&&&&&&&&
02. 就是说,根据条件的真、假,只能选择一个表达式的结果作为整个表达式的结果。
3.11.04& 优先级
&&&&&&&&&&&&&&&&&&
高于赋值运算符,低于逻辑关系运算符。
3.11.05& 实例
&&&&&&&&&&&&&&&&&&
实例1:求两个数中的小的
&&&&&&&&&&&&&&&&&&&&&&&&&
#include &stdio.h&
&&&&&&&&&&&&&&&&&&&&&&&&&
int main (void)
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
int max, temp1 = 786, temp2 = 689;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
int min = 0;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
printf ("%d\n", (temp1 & temp2) ? temp1 :
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
实例2:求三个数中从小到大的顺序排列
&&&&&&&&&&&&&&&&&&&&&&&&&
方法1:不变换变量
&&&&&&&&&&&&&&&&&&&&&&&&&
方法2:交换变量
&&&&&&&&&&&&&&&&&&&&&&&&&
方法3:不声明其他变量
逗号运算符
3.12.01& 定义
&&&&&&&&&&&&&&&&&
多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
3.12.02& 格式
&&&&&&&&&&&&&&&&&
&表达式1&,&表达式2&,贩&表达式n&
3.12.03& 说明
&&&&&&&&&&&&&&&&&
计算过程:依次计算&表达式1&的值,&表达式2&的值,…,&表达式n&的值,最后将&表达式n&的值作为整个表达式的结果值。因此逗号表达式又称为“顺序求值运算”。
3.12.04& 优先级
&&&&&&&&&&&&&&&&&
所有运算符中级别最低。
3.12.05& 结合方向
&&&&&&&&&&&&&&&&&
自左向右(左结合性)。
3.12.06& 实例
&&&&&&&&&&&&&&&&&
c=a,2*a,2*b的结果为10.4(最后一个表达式的值),因为逗号表达式的求值顺序是:先计算c=a,将a的值赋给c(c=2),其此计算2*a的值(为4),最后计算2*b的值(为10.4)。当整个表达式计算结束后,c的值为2,整个表达式的值为10.4。
3.13& 强制类型转换运算符
3.14.01& 定义
&&&&&&&&&&&&&&&&&&
01. 可以利用强制类型转换运算符将一个表达式转换成所需类型。
3.14.02& 格式
&&&&&&&&&&&&&&&&&&
(类型名)(表达式)
3.14& 表达式
3.4.01& 表达式的处理原则
&&&&&&&&&&&&&&&&&
01. 在表达式求值时,先按运算符优先级别高低次序执行;
&&&&&&&&&&&&&&&&&
02. 如果在一个运算对象两侧的运算符优先级别相同,则按规定的“结合方向”处理;
&&&&&&&&&&&&&&&&&
03. 算术运算符的“结合方向”为自左至右,先左后右的顺序。
3.4.02& 赋值表达式
&&&&&&&&&&&&&&&&&
01. 由赋值运算符 =,将一个变量和一个表达式连接起来的式子称为“赋值表达式”;
&&&&&&&&&&&&&&&&&
02. 形式:&变量&
&由赋值运算符&
&表达式&;
&&&&&&&&&&&&&&&&&
03. 赋值运算符按照“自右而左”的结合顺序。
3.15& 优先级、结合性
3.14.01& 总结表
&&&&&&&&&&&&&&&&&&&&
运算符&&&&&&&
&&&&&&&&&&&&&&&&&
(最高优先级)
&&&&&&&&&&&&&&&&&&
自左向右&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
(type)&&&&&
自右向左&&&
&&&&&&&&&&&&&&&&&&
* & sizeof
&&&&&&&&&&&&&&&&&&&&
自左向右&&&
&&&&&&&&&&&&&&&&&&&&&
自左向右&&&
&&&&&&&&&&&&&&&&&&&&
自左向右&&&
&&&&&&&&&&&&&&&&&&&
自左向右&&&
&&&&&&&&&&&&&&&&&&&&&
自左向右&&&
&&&&&&&&&&&&&&&&&&&&&&&
自左向右&&&
&&&&&&&&&&&&&&&&&&&&&&&
自左向右&&&
&&&&&&&&&&&&&&&&&&&&&&&
自左向右&&&
10级运算符
&&&&&&&&&&&&&&&&&&&&&&&
自左向右&&&
11级运算符
&&&&&&&&&&&&&&&&&&&&&&&
自左向右&&&
12级运算符
&&&&&&&&&&&&&&&&&&&&&&&
自右向左&&&
13级运算符
&&&&&&&&&&&&&&&&&&&
Assignments&&
自右向左&&&
14级运算符
&&&&&&&&&&&&&&&&&
(= += -= *= /= %= &= ^= |= &=)
&&&&&&&&&&&&&&&&&&&&&
自左向右&&&
15级运算符
&&&&&&&&&&&&&&&&&
(最低优先级)
3.14.02& 说明
&&&&&&&&&&&&&&&&&&
01. 优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级;
  &&&&&&&&&&&&&&
02. 所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其它的都是从左至右结合;
  &&&&&&&&&&&&&&
具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。()是与函数相关,[]与数组相关,而-&及.是取结构成员;
  &&&&&&&&&&&&&&
其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的;
05. 另外在C语言里 没有前置后置之分 因为++ -- 是右结合所以 右侧优先运算 表现为 "后置优先级比较高" 的假象
前置和后置的区分是因为运算符重载而后加入C++的;
&&&&&&&&&&&&&&&&&&
06. 关系运算符中,& &= &
&=要比 == !=高一个级别,不大好理解;
&&&&&&&&&&&&&&&&&&
07. 所有的逻辑操作符都具有不同的优先级(单目运算符出外,!和~);
&&&&&&&&&&&&&&&&&&
08. 逻辑位操作符的"与"比"或"高,而"异或"则在它们之间;
&&&&&&&&&&&&&&&&&&
只有4个运算符规定了运算方向,它们是&&、||、条件运算符及赋值运算符。
3.14.03& 运算符优先级等级口诀
&&&&&&&&&&&&&&&&&&
01. 圆方括号、箭头一句号, 自增自减非反负、针强地址长度;
  &&&&&&&&&&&&&&
02. 乘除,加减,再移位;
  &&&&&&&&&&&&&&
03. 小等大等、等等不等;
  &&&&&&&&&&&&&&
04. 八位与,七位异,六位或,五与,四或,三疑,二赋,一真逗;
  &&&&&&&&&&&&&&
05. 其中“,”号为一个等级分段。
3.16& sizeof运算符
详见“sizeof运算符总结”。
3.17& 位运算符
详见“位运算总结”。
3.18& 指针运算符
详见“指针总结”。
3.19& 特殊运算符
3.18.01& 括号()
&&&&&&&&&&&&&&&&&&
01. 括号运算符,把表达式左右两端括起来,那么括号内的有最优先的级别,先求这里的值;
&&&&&&&&&&&&&&&&&&
02. 括号必须配对使用;
&&&&&&&&&&&&&&&&&&
03. 多层次的括号使用时,一定注意配对。
3.18.02& 下标[]
&&&&&&&&&&&&&&&&&&
详见“数组总结”。
3.18.03& 成员(-&,.)成员
&&&&&&&&&&&&&&&&&&
详见“结构体总结”。
4.01& 变量定义
01. An integer
&&&&&&&&&&&&&
一个整型数
&&&&&&&&&&&&&
& // * An integer
02. A pointer to an integer
&&&&&&&&&&&&&
一个指向整型数的指针
&&&&&&&&&&&&&
int *a;& // * A pointer to an integer
03. A pointer to a pointer to an intege
&&&&&&&&&&&&&
一个指向指针的的指针,它指向的指针是指向一个整型数
&&&&&&&&&&&&&
int **a;& // * A pointer to a pointer to an
04. An array of 10 integers
&&&&&&&&&&&&&
一个有10个整型数的数组
&&&&&&&&&&&&&
int a[10];& // * An array of 10 integers
05. An array of 10 pointers to integers
&&&&&&&&&&&&&
一个有10个指针的数组,该指针是指向一个整型数的
&&&&&&&&&&&&&
int *a[10];& // * An array of 10 pointers to
06. A pointer to an array of 10 integers
&&&&&&&&&&&&&
一个指向有10个整型数数组的指针
&&&&&&&&&&&&&
int (*a)[10];& // * A pointer to an array of 10
07. A pointer to a function that takes an integer as an argument
and returns an integer
&&&&&&&&&&&&&
一个指向函数的指针,该函数有一个整型参数并返回一个整型数
&&&&&&&&&&&&
int (*a)(int);& // * A pointer to a function a
that takes an integer argument and returns an integer
08. An array of ten pointers to functions that take an integer
argument and return an integer
&&&&&&&&&&&&&
一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
&&&&&&&&&&&&&
int (*a[10])(int);& // * An array of 10 pointers
to functions that take an integer argument and return an
4.02& 求表达式的值
01. 求 k 的值?
&&&&&&&&&&&&&
int k = 15,
&&&&&&&&&&&&&
t = k && k == 5
&&&&&&&&&&&&&
k的值为15;
&&&&&&&&&&&&&
与表达式k&&k==5&&++k,k不等于0为真,再计算k==5为假,那么后面的++k就不执行了。与表达式只从左至右计算的,只要有一个为假,后面的表达式就不求值了的
&&&&&&&&&&&&&
运算符的优先级不是计算优先级,而是结合优先级,所以:
&&&&&&&&&&&&&
int k=15,t;&
&&&&&&&&&&&&&
t=k&&k==5&&++k;&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
第一步结合:t=k&&k==5&&(++k);&
&&&&&&&&&&&&&
第二步结合:t=k&&(k==5)&&(++k);
&&&&&&&&&&&&&
第三步结合:t=(k&&(k==5))&&(++k);&&
&&&&&&&&&&&&&
第四步结合:t=((k&&(k==5))&&(++k));
&&&&&&&&&&&&&
而&&是有计算顺序的,先计算表达式((k&&(k==5)),将此表达式分解,先计算K,K是真,再计算(K==5),K不等于5,所以表达式((k&&(k==5))为假,根据短路原则,不再计算,所以t为0,K为15.&
&&&&&&&&&&&&&
要理解这个问题分三步:
&&&&&&&&&&&&&
1. 重点记住
&&&&&&&&&&&&&&&&
=的优先级比&&,==,++都要低,且它的结合性为 右
&&&&&&&&&&&&&&&&
&&的优先级低于==,++,且它的结合性为 左 结合性
&&&&&&&&&&&&&&&&
==的优先级低于++,且它的结合性为 左 结合性
&&&&&&&&&&&&&&&&
++的优先级这这个表达式中最高,且它的结合性为 右 结合性
&&&&&&&&&&&&&
2. 时刻想到
&&&&&&&&&&&&&&&&
逻辑运算符&&和||会出现短路现象:
&&&&&&&&&&&&&&&&
:当&&的左边为假时短路,此时不再执行&&右边的表达式(注意是&&右边的另一个表达式,而不是右边所有到到语句结束的表达式!!)
&&&&&&&&&&&&&&&&
* || * :当||的左边为真时短路,些时不再执行||右边的表达式
&&&&&&&&&&&&&
3. 详细推导
&&&&&&&&&&&&&&&&
在表达式t=k&&k==5&&++k中,根据运算符的优先级和结合性来确定,表达式相当于:
&&&&&&&&&&&&&&&&
t= ( k && (k==5)
&& (++k) )
&&&&&&&&&&&&&&&&
根据&&的结合性,表达中肯定先验证第一个&&的两边为:k
&&&&&&&&&&&&&&&&
由于k为15,左边为真,并没有短路,所以继续看&&的右边,表达k==5明显为假,值为0,所以表达式k
&& (k==5)为假,值为0,此时表达简化为:
&&&&&&&&&&&&&&&&
t= ( 0 && (++k) )
&&&&&&&&&&&&&&&&
此时表达式中的&&为原表达式中的第二个&&,再看这个表达式的0
(++k),很明显&&的左边为0,发生短路,那么不再执行&&的(++k),所以k保持原值不会为16,此时原表达式又进一步简化为:
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
最后,t的值为0,k的值不变为15
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
计算对表达式的是利用栈作工具,并且是从左到右的扫描,并且每次都是尽最大可能的结合,
&&&&&&&&&&&&&&&&&&&
比如:a=*888,在扫描识别表达式的时候,不可能到a=3就停止了,而是尽最大可能的结合,一直要扫描到a=32222+才暂时停止,为什么?因为32222这个数字尽最大可能结合完成了,但还要多往后面扫描一个字符,只有这样才能知道不能再和+结合了,但此时并不执行a=32222,为什么?因为运行符是有优先级的,刚才扫描到+号的时候就发现结合完成了,但同时进行判断+的优先级比=高,所以先把变量a和操作符=入栈,挂起=运算,优先处理+号
&&&&&&&&&&&&&&&&&&&
又因为+号的双目运算符,要两个运算数据,现在有了一个32222,还差一个,所以又往后扫描,还是尽最大努力结合,到1115*的时候又结束,+号的两个运算数据全部在了,便扫描暂停的同时又发现最后一个运算符为*优先级比+还高,又要把+号操作和1115入栈,又由于*也是一个双目运算符,所以还差一个运算数据,还要扫描,这次直接到;号,发现整个表达式结束了,且*的两个运算数据都在了,且后面没有跟比*优先级更高的运算符,所以要计算15出栈,计算相乘,得到结果,再从栈中弹出32222和+操作进行加法运算,最后再处理赋值运算,所以计算机不是人,它不会像人一样直接就找到优先级最高的*号进行运算
&&&&&&&&&&&&&&&&&&&
再回到刚才的问题上,表达式t=k&&k==5&&++k从左到右的扫描,你现在还能认为它像人一样,最先执行++k吗?
&&&&&&&&&&&&&&&&&&&
只有扫描到了,且满足运算符的优先级、结合数目等要求了才轮得到它去执行!!!这样看来它又怎么会先执行++?!
02. total1=total2=0; 求total1的值?
&&&&&&&&&&&&&
第二个赋值语句的意思是把0同时赋值给两个变量。这是因为赋值语句是从右向左运算的,也就是说从右端开始计算。这样它先total2=0;然后total1=total2;那么我们这样行不行呢?
&&&&&&&&&&&&&
(total1=total2)=0;
&&&&&&&&&&&&&
这样是不可以的,因为先要算括号里面的,这时total1=total2是一个表达式,而赋值语句的左边是不允许表达式存在的。
05. Trap & Pitfalls:
全局变量和静态变量系统默认负初值为0。
&&& 02. int a =
b = c = 8; 这样是不对的,应该:int a = 8, b = 8, c = 8;
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型;
整型、浮点型、字符型数据间可以混合运算;在进行运算时,不同类型数据要先转换成同一类型,然后进行运算。char,
short转成int--&unsigned--&long--&float转换成double;
float型数据在运算时一律先转换成双精度型,以提高运算精度,即使是两个float型数据相加,也先都化成double型,然后再相加;
表达式不能进行自加自减运算;
当一个逻辑表达式的后一部分的取值不会影响整个表达式的值时,后一部分就不会进行运算了;
不可太贪心,如:y = x出现为止。应改成:y = x/(*p);
注意字符与字符串,用单引号括起的一个字符代表一个整数,而用双引号括起的一个字符代表一个指针;
如果一个整型常量的第一个字符是数字0,那么该常量将被视作八进制数;
需要注意有时候在上下文中为了格式对齐的需要,可能无意中将十进制数
写成了八进制数,例如:
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
} parttab[] = {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
046,& "left-handed widget"&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
047,& "right-handed widget" ,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
125,& "frammis"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
06. Diligence
局部变量系统负初值是不确定的,最好是定义时负初值;
初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予的,相当于一个赋值语句;
常量和变量进行比较的时候,把常量写在前面,避免把“==”写成“=”,如:if (5 == i);
采用复合运算符,一是简化程序,二是提高编译效率,这种写法与“逆波兰”式一致,能产生质量较高的目标代码;
编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符组成的字符串已不再可能组成一个有意义的符号。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 c语言合法字符常量 的文章

 

随机推荐