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、源碼:

相關文章
相關標籤/搜索