程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 程序猿之---C語言細節2

程序猿之---C語言細節2

編輯:關於C語言

程序猿之---C語言細節2


主要內容:“ ; ”符號有無細節、符號優先級、break;

#include  

/*
最簡單的C語言程序為
main()
{}
注意在有些開發環境可能這樣還不能運行,在cfree就說不法定位,在linux用gcc編譯運行成功
嚴格來說要返回一個整型,因為函數默認返回int型
*/
struct test{
 int a;
 int b;
 int c;
}               // 這裡也是存在一個有無 " ; " 的問題,沒有的話編譯器不報錯, 
		// 編譯在struct結構體當成函數的返回類型,僅限後面是函數的情況下, 
		// 當然這個情況限於func()函數沒有在調用前聲明,如果把這幾段程序放在mian函數後面,
		// 並在main函數前聲明func(),沒有加返回類型,但是應該有默認返回int類型; 因為在聲明時就確定了
		// 返回類型 ,所以在這個情況下編譯是會報錯誤的 
func()
{
	printf("test\n");
}

int main(int argc, char *argv[])
{
	/*  1、函數指針調用,如 p是一個函數指針,調用p指向的函數必須寫成(*p)();,寫成*p(),編譯器會解釋成*(p()); 
	 *  2、類型轉換也是單目運算符,單目運算符是自右向左結合,*p++被編譯器解釋成*(p++),即取指針p所指向的對象,然後將p遞增1;而不是
	 *	(*p)++,即指針p所指向的對象,然後將該對象遞增1; 
	 */
	int j,i = 3;
	
	switch(i) 
	{
		case 3:
		  printf("3\n"); 
		case 1:
		  printf("1\n");
		  break;   // 這是i = 3;缺少break就一直執行到有break的地方,如果都沒break
		  		   // 就執行到default結束;
				   // 如果是你本人需要不加break,則好的做法是加上注釋 ,如/*此處沒有break*/ 
	 	case 2:
	 	  printf("2\n");	
	  	default:
	  	  printf("default\n");
	}
	
	while(i >= 0) //如果在這裡加了" ; " 這循環會影響代碼邏輯 ,而這些編譯不會報錯 
	{
		printf("i = %d\n",i);
		i--; 
	}
	
	func();  // func();是可以輸出printf信息,返回類型沒有加;轉到上面有個隱含錯誤 
	func;    // 上面的func();是函數調用;而這裡什麼也不做,精確講是計算函數地址 
	if (i < 0) 
	     return ;  // 如果在這裡少了" ; " 則返回5,下面”i = 5;而這些編譯不會報錯“ 
	               // 在缺少" ; "情況下,當你的i>= 0時 ,i = 5;則被略過了,少了這條賦值
				   // 語句後續有關操作就會潛在潛伏一個很深,很難發現一個bug 
		 i = 5;
		 j = 4;
    
	return 0;
}


輸出:


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved