Linux C 编程学习第二天
常量
常量(Constant)是程序中最基本的元素,有字符常量、整数常量、浮点数常量和枚举常量。
字符常量要用单引号括起来,例如: '}' 注意单引号只能扩一个字符,而不能想双引号那样扩一串字符,接下来做个简单的测试:
编译运行的结果是:
字符常量也可以是一个转义序列,例如: '\n' 虽然这个单引号扩了两个字符但实际上只表示一个字符,和自负床字面值使用转义序列有一点区别,如果在字符常量中要表示双引号"和?可以使用转义序列 \" 和 \? 也可以直接使用字符 " 和 ? ,而要表示 ' 和 \ 则必须使用转义序列
变量
常量有不同类型,变量也是如此,他们的类型决定了所占用存储空间的大小
分别由:整型、字符型、浮点型,浮点有三种,float double long double
变量取名必须以字母或者下划线开始,后面可以根若干字符、数字、下划线、但是不能有其他字符,命名不能使用关键字,通常编辑器会对关键字进行高亮度显示,C99规定的关键字有:
一般来说避免使用以下划线开头的标识符,防止命名冲突
赋值
定义了变量之后,用赋值语句将值存在它们所表示的存储空间里
注意变量一定要先声明后使用
变量的定义和赋值可以一步完成,这称之为变量的初始化(Initialization)
在初始化语句中,等号右边的值叫做Initializer,初始值,初始化是一种特殊的变量定义语句,不是一种赋值语句。
char letter;
int hour;
hour = 11;
letter = 'a';
以上代码等同于:
char letter = 'a';
int hour = 11;
表达式
+ - * / 称之为运算符,参与运算的常量和变量称之为 操作数,hour + 1 这样的算式称为表达式
运算符是具有优先级的
printf(); 函数可以直接输出复杂的表达式的值
表达式是可以组合的,理解组合式理解语法规则的关键所在,但是表达式不易过度组合,否则程序会失去可读性。
例如:
printf("num1 = %d\n num2 = %d\n num3 = %d\n", num1 ,num2, (num1 \ num2 + num2 * num1)+num1);
注意,根据语法规则组合出来的表达式在语义上并不总是正确的,例如:
minute + 1 = hour
等号左边的表达式要求表示一个存储位置而不是一个值,有的表达式既可以表达一个存储位置也可以表达一个值,而有的表达式只能表示值,不能表达存储位置,上述便是语义错误,表达式所存储位置称为左值 (lvalue) 允许放在等号左边,而表达式的值称为右值 (rvalue) 只能放在等号右边,简单点说:有的表达式有左值也有右值,有的表达式只有右值。
看到一个很有意思的例子说明了上述问题:
定义int a, b, c; a = b = c;这个式子就是合法的,但是 (a = b) = c; 就是不合法的,前者是先求b = c,然后a = b; 而后者则是先进行 a = b;是对的,但是(a = b)这个实自不能作左值了,所以放在一起 (a = b) = c 就是不合法的。
除法运算有些许特殊,由于变量和常量是有类型的,所以在进行除法运算的时候会有误差
这种做法是对的,但是由于hour 和 minute 是 int 型,所以会造成小数部分丢失,结果为0
若将这两个变量定义为浮点型,就会有小数输出,但是我们还有另外一种做法:
printf(" %d and %f hours\n ", hour, minute / 60.0);
60.0是double型的,在进行除法运算的时候,C语言会将 minute 转换称为 double 型进行运算
字符类型和字符编码
符号在计算机内部也使用数字表示,每个字符在计算机内部用一个整数表示,称为字符编码,目前最常用的是 ASCII 码
有一点需要说明,之前我们知道整型是指 int 型,而现在又知道了 char 型本质上就是整数,只不过取值范围比 int 小,所以 char 和 int 统称为整数类型,另外最有趣的一点就是:
字符(注意是字符)'a' 到 'z'、'A' 到 'Z'、'0' 到 '9' 的ASCII码都是连续的,因此表达式 'a' + 25和 'z' 的值是一样的,需要注意的是 '0' 到 '9' 的ASCII码是16进制的30~39,这和整数值 0~9 是不一样的,千万别将这两者混淆。