天天看點

c 基本概念易錯點總結

1、i++類

int i = 1 ,j =2;
int k = i+++j;
cout<<k<<endl;//輸出的值為3,因為首先結合i++
           

2、x=x+1,x+=1,x++的運作效率問題

其中x++最快,x+=1次之,x=x+1最慢(影響的主要因素是讀取x位址的次數和指派)

3、

#define product(x) (x*x)
int main(){
	int i = 3,j,k;
	j = product(i++);
	k = product(++i);
	cout<<j<<endl;	//結果為9
	cout<<k<<endl;  //結果為49而非25,因為product(i++)=i++*i++;
}
           

4、類型轉換

char foo(void){
	unsigned int a = 6;
	int b = -20;
	char c ;
	(a+b>6)?(c=1):(c=0);
	return c;
	//c的結果是1二并不是0,因為unsigned int 類型的資料與int類型的資料相運算後,自動轉化成
	//unsigned int 類型的,是以a+b的結果并不是-14,而是一個unsigned int 類型的數4294967382
}
           

5、優先級

#include<stdio.h>
void main(){
	int a = 5;
	int b = 4,c = 3;
	a-=b-c;
	printf("%d\n",a);//輸出結果為4二不是-2,先計算b-c
}
           

6、不用if,switch,"? :"或其他判斷語句求兩個數的最大值

#include<stdio.h>
#include<stdlib.h>
void main(){
	int a =3;
	int b =10;
	printf("%d",((a+b)+abs(a-b))/2);
}
           

7、不使用中間變量交換a,b的值

#include<stdio.h>
#include<stdlib.h>
void main(){
	int a =3;
	int b =10;
	a = a^b;
	b = a^b;
	a = a^b;
	printf("%d%d",a,b);
}
           

8、在main函數執行過後在執行一段代碼

如果需要加入一段在main函數退出後執行的代碼,可以使用atexit()函數注冊一個函數

#include<stdlib.h>
int atexit(void (*function)(void));
#include<stdio.h>
  
		   void fn1(){
	printf("second\n");
}
		   void fn2(){
			printf("third\n");
		   }
void main(){
	atexit(fn1);
	atexit(fn2);
	printf("this id excute first\n");
}
           
c 基本概念易錯點總結