C连载26-强转、原型、待转与目标不匹配

1、待转换的值和目标类型不匹配

  • (1)目标类型是无符号类型,且待赋的值是整数时,额外的位将被忽略。例如:目标类型时8位unsigned char,待赋的值时原始值求模256
  • (2)若是目标类型是一个有符号的整数,且待赋的值是整数,结果因实现而异
  • (3)若是目标类型是一个整数,且待赋的值是浮点数,该行为是未定义的。
  • 浮点值被转换为整数类型会进行截断,例如:26.325截断为26
#include<stdio.h>
int D26_1_conver(void) {
	char ch;
	int i;
	float fl;

	fl = i = ch = 'C';
	printf("ch=%c,i=%d,fl=%2.2f\n", ch, i, fl);

	ch = ch + 1;
	i = fl + 2 * ch;
	fl = 2.0 * ch + i;
	printf("ch=%c,i=%d,fl=%2.2f\n", ch, i, fl);

	ch = 1107;
	printf("Now ch=%c\n", ch);
	ch = 80.89;
	printf("Now ch = %c\n", ch);

	return 0;
}

26.1

2、强制类型转换

  • 和Java同样,用(类型)变量名进行强制转换

3、sizeof

  • 获取器右侧运算对象的大小(以字节为单位),运算对象能够是一个被圆括号括起来的类型说明符,如:sizeof(float), 或者是一个具体的变量名、数组名等,如:sizeof foo

4、带参数的函数

  • 下面这种传递参数在Java中好像是不容许的,由于Java中是有“多态”特性的,若是能够的话,那么Java的多态无论用了
#include<stdio.h>
void pound(int n);//ANSI函数原型声明

int D26_2_pound(void) {
	int times = 5;
	char ch = '!';   //ASCII码是33
	float f = 6.0f;
	 
	pound(times);     //int类型的参数
	pound(ch);       //和pound((int)ch);相同
	pound(f);     //和pound((int)f);相同

	return 0;
}

void pound(int n) {  //ANSI风格函数头
	while (n-- > 0) {
		printf("#");
	}
	printf("\n");

}

26.2

在ANSI C以前,C使用的是函数声明,而不是函数原型。函数声明只是指明了函数名以及返回类型,没有指明参数类型,为了向下兼容,C如今容许void pound();//ANSI C以前的函数声明,若是不加int n,那么程序中pound(f)会失败git

5、源码: