#include<stdio.h>
#define ADJUST 7.31
int main(void)
{
const double SCALE = 0.333;
double shoe, foot;
printf("Shoe size (men's) foot length\n");
shoe = 3.0;
while (shoe < 18.5)
{
foot = SCALE * shoe + ADJUST;
printf("%10.1f %15.2f inches\n", shoe, foot);
shoe += 1.0;
}
printf("if the shoe fits, wear it.\n");
return 0;
}
一些术语
用于储存值的数据存储区域统称为数据对象。C标准只有字体到这个概念时才会用到对象这个术语。
左值时C语言的术语,用于标识特定数据对象的名称或表达式。因此对象指的是实际的数据存储,而左值是用于标识或定位存储位置的标签30
除法注意事项
整数除法的结果时整数,浮点数除法的结果是浮点数。
整数除法的小数部分会被丢弃,这一过程被称为截断。
负数应该使用趋零截断,即-3.8 会写成 -3
sizeof
sizeof 运算符以字节为单位返回运算对象的大小(在C中,1字节的定义为char 类型占用空间的大小)
C语言规定,sizeof返回size_t类型的值,这是一个无符号整数类型,但它不是新类型。C头文件系统可以使用typedef把 size_t 作为 unsigned int 或 unsigned long 别名。
typedef:允许程序与为现有的类型创建别名,例如:
typedef double real;
这样real就是double 的别名。可以声明一个real类型变量:
real deal;
求模运算符:%
负数求模,根据C99新规的“趋零截断”如果第一个运算对象对象是负数,那么求模的结果为负数;如果第一个运算对象是正数,那么求模的结果为正数。例如:
11 % 5 = 1, 11 % -5 = 1, -11 % 5 = -1, -11 % -5 = -1;
递增和递减运算符++, --
都只能影响一个变量(可修改的左值),例如:(x * y)++是无效的
注意事项:
根据C标准,声明不是语句,与C++不同。
C语言中,赋值和函数调用都是表达式,没有所谓的“赋值语句”和“函数调用语句”,这些语句实际上都是表达式语句。
每个表达式都有一个值。
类型转换
1.无论是 unsigned 还是 signed 的 char, short 都会被自动转换成int,如有必要,还会转换成 unsigned int (如果short 和 int 大小相同,unsigned short 会比 int 大,如此一来unsigned short 会自动转换为 unsigned int)
2.涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别。
3.当作为幻术参数传递时,char 和 short 会被转换成 int, float 会被转换成 double
4.降级,较低类型可能放不下整个数字
5.目标类型是无符号整型,且待赋的值是整数时,额外的位将会被忽略,例如:
假设目标类型是一个8位无符号整型,待赋的值是十进制数57(二进制表示为00111001),则:
如果将57赋值给该无符号整型变量,那么它将被存储为00111001,因为57的二进制表示正好占用8位,没有多余的位。
如果将6赋值给该无符号整型变量,那么它将被存储为00000110,因为6的二进制表示只占用3位,不足8位的高位会被自动补零。
如果将1000赋值给该无符号整型变量,那么它将被存储为11101000,因为1000的二进制表示占用10位,超过了8位目标类型的位数,多余的两位将被忽略。
6.如果目标是一个有符号整型,且待赋的值是整数,结果因实现而异
7.如果目标类型是一个整型,且待赋值的是浮点数,该行为是未定义的。