c語言item
『壹』 c語言double item什麼意思
double在這里是指將變數i和變數s定義為雙精度實型變數。(也就是說:賦給這兩個變數的值將以雙精度實型格式存儲在內存中)
注意事項
1、類型說明符和表達式都必須加括弧(單個變數可以不加括弧),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之後再與y相加了。
2、無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變數的數據長度進行的臨時性轉換,而不改變數據說明時對該變數定義的類型。
(1)c語言item擴展閱讀
賦值中的類型轉換
當賦值運算符兩邊的運算對象類型不同時,將要發生類型轉換, 轉換的規則是:把賦值運算符右側表達式的類型轉換為左側變數的類型。具體的轉換如下:
1、浮點型與整型
將浮點數(單雙精度)轉換為整數時,將舍棄浮點數的小數部分, 只保留整數部分。將整型值賦給浮點型變數,數值不變,只將形式改為浮點形式, 即小數點後帶若干個0。注意:賦值時的類型轉換實際上是強制的。
2、單、雙精度浮點型
由於C語言中的浮點值總是用雙精度表示的,所以float 型數據只是在尾部加0延長為double型數據參加運算,然後直接賦值。double型數據轉換為float型時,通過截尾數來實現,截斷前要進行四捨五入操作。
3、char型與int型
int型數值賦給char型變數時,只保留其最低8位,高位部分舍棄。
char型數值賦給int型變數時, 一些編譯程序不管其值大小都作正數處理,而另一些編譯程序在轉換時,若char型數據值大於127,就作為負數處理。
對於使用者來講,如果原來char型數據取正值,轉換後仍為正值;如果原來char型值可正可負,則轉換後也仍然保持原值, 只是數據的內部表示形式有所不同。
『貳』 C語言中靜態局部變數的問題
靜態局部變數相當於全局變數(只是只有在這個函數中能訪問,但是生命周期是和全局變數差不多的),函數退出之後變數還在,而且只在第一次進入的時候做初始化,以後會跳過初始化語句,保留原來的值(也就是說,如果item是static的,那麼只有在第一次進入這個函數的時候會執行item=0,以後都不會執行。)。
『叄』 C++ 中的Item是什麼關鍵字可以定義什麼型的變數
NEW是C 的關鍵字,能進行類型的檢查之類的
malloc是C跟C 都可以用的
不能進行類型檢查之類
如果是在C 中,推薦使用new
inline函數區別與普通函數在於調用普通函數時程序有壓棧和出棧操作,而inline(內聯)函數編譯器在預處理的時候會把它的代碼加到調用它的函數中,而不用額外的跳轉操作,從而提高了程序的效率。
但是inline不允許有switch, 循環等復雜語句。
堆,可用NEW對它分配內存,DELETE銷毀內存空間。
棧,是由程序本身建立,分配,消除的內存空間!他服從先進後出(FILO)的原則,從而可以把各個變數按生存期分開!
static 聲明的變數在C語言中有兩方面的特徵:
1)、變數會被放在程序的全局存儲區中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。
2)、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。
Tips:
A.若全局變數僅在單個C文件中訪問,則可以將這個變數修改為靜態全局變數,以降低模塊間的耦合度;
B.若全局變數僅由單個函數訪問,則可以將這個變數改為該函數的靜態局部變數,以降低模塊間的耦合度;
C.設計和使用訪問動態全局變數、靜態全局變數、靜態局部變數的函數時,需要考慮重入問題;
D.如果我們需要一個可重入的函數,那麼,我們一定要避免函數中使用static變數(這樣的函數被稱為:帶「內部存儲器」功能的的函數)
E.函數中必須要使用static變數情況:比如當某函數的返回值為指針類型時,則必須是static的局部變數的地址作為返回值,若為auto類型,則返回為錯指針。
函數前加static使得函數成為靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的作用域僅局限於本文件(所以又稱內部函數)。使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。
擴展分析:術語static有著不尋常的歷史.起初,在C中引入關鍵字static是為了表示退出一個塊後仍然存在的局部變數。隨後,static在C中有了第二種含義:用來表示不能被其它文件訪問的全局變數和函數。為了避免引入新的關鍵字,所以仍使用static關鍵字來表示這第二種含義。最後,C 重用了這個關鍵字,並賦予它與前面不同的第三種含義:表示屬於一個類而不是屬於此類的任何特定對象的變數和函數(與Java中此關鍵字的含義相同)。
全局變數、靜態全局變數、靜態局部變數和局部變數的區別變數可以分為:全局變數、靜態全局變數、靜態局部變數和局部變數。
按存儲區域分,全局變數、靜態全局變數和靜態局部變數都存放在內存的靜態存儲區域,局部變數存放在內存的棧區。
按作用域分,全局變數在整個工程文件內都有效;靜態全局變數只在定義它的文件內有效;靜態局部變數只在定義它的函數內有效,只是程序僅分配一次內存,函數返回後,該變數不會消失;局部變數在定義它的函數內有效,但是函數返回後失效。全局變數(外部變數)的說明之前再冠以static 就構成了靜態的全局變數。全局變數本身就是靜態存儲方式, 靜態全局變數當然也是靜態存儲方式。 這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。 而靜態全局變數則限制了其作用域, 即只在定義該變數的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。
從以上分析可以看出, 把局部變數改變為靜態變數後是改變了它的存儲方式即改變了它的生存期。把全局變數改變為靜態變數後是改變了它的作用域, 限制了它的使用范圍。
static函數與普通函數作用域不同。僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件
static全局變數與普通的全局變數有什麼區別:static全局變數只初使化一次,防止在其他文件單元中被引用;
static局部變數和普通局部變數有什麼區別:static局部變數只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
全局變數和靜態變數如果沒有手工初始化,則由編譯器初始化為0。局部變數的值不可知。
C 中extern 「C」含義深層探索
1.引言
C 語言的創建初衷是「a better C」,但是這並不意味著C 中類似C 語言的全局變數
和函數所採用的編譯和鏈接方式與C 語言完全相同。作為一種欲與C 兼容的語言,C 保留了
一部分過程式語言的特點,因而它可以定義不屬於任何類的全局變數和函數。但是,C 畢竟
是一種面向對象的程序設計語言,為了支持函數的重載,C 對全局函數的處理方式與C 有明
顯的不同。
2.從標准頭文件說起
某企業曾經給出如下的一道面試題:
面試題
為什麼標准頭文件都有類似以下的結構?
#ifndef _TEST_H
#define _TEST_H
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* _TEST_H */
分析
顯然,頭文件中的編譯宏「#ifndef _TEST_H、#define _TEST_H、#endif」 的作用是防止
該頭文件被重復引用。
那麼
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
的作用又是什麼呢?
3.深層揭密extern "C"
extern "C" 包含雙重含義,從字面上即可得到:首先,被它修飾的目標是「extern」的;
其次,被它修飾的目標是「C」的。讓我們來詳細解讀這兩重含義。
被extern "C"限定的函數或變數是extern 類型的;
extern 是C/C 語言中表明函數和全局變數作用范圍(可見性)的關鍵字,該關鍵字告
訴編譯器,其聲明的函數和變數可以在本模塊或其它模塊中使用。記住,下列語句:
extern int a;
僅僅是一個變數的聲明,其並不是在定義變數a,並未為a 分配內存空間(特別注意:實
際上現在一般的編譯器都會對上述語句作聲明處理,但鏈接器在鏈接過程中如果沒有發現該
變數的定義,一般會在第一次遇到該變數聲明的地方,自動定義)。變數a 在所有模塊中作為
一種全局變數只能被定義一次,否則會出現連接錯誤。
通常,在模塊的頭文件中對本模塊提供給其它模塊引用的函數和全局變數以關鍵字
extern 聲明。例如,如果模塊B 欲引用該模塊A 中定義的全局變數和函數時只需包含模塊A
的頭文件即可。這樣,模塊B 中調用模塊A 中的函數時,在編譯階段,模塊B 雖然找不到該
函數,但是並不會報錯;它會在連接階段中從模塊A 編譯生成的目標代碼中找到此函數。
與extern 對應的關鍵字是static,被它修飾的全局變數和函數只能在本模塊中使用。因
此,一個函數或變數只可能被本模塊使用時,其不可能被extern 「C」修飾。
被extern "C"修飾的變數和函數是按照C 語言方式編譯和連接的;
未加extern 「C」聲明時的編譯方式
首先看看C 中對類似C 的函數是怎樣編譯的。
作為一種面向對象的語言,C 支持函數重載,而過程式語言C 則不支持。函數被C 編
譯後在符號庫中的名字與C 語言的不同。例如,假設某個函數的原型為:
void foo( int x, int y );
該函數被C 編譯器編譯後在符號庫中的名字為_foo,而C 編譯器則會產生像
_foo_int_int 之類的名字(不同的編譯器可能生成的名字不同,但是都採用了相同的機制,
生成的新名字稱為「mangled name」)。
_foo_int_int 這樣的名字包含了函數名、函數參數數量及類型信息,C 就是靠這種機制
來實現函數重載的。例如,在C 中,函數void foo( int x, int y )與void foo( int x, float
y )編譯生成的符號是不相同的,後者為_foo_int_float。
同樣地,C 中的變數除支持局部變數外,還支持類成員變數和全局變數。用戶所編寫程序的
類成員變數可能與全局變數同名,我們以"."來區分。而本質上,編譯器在進行編譯時,與函
數的處理相似,也為類中的變數取了一個獨一無二的名字,這個名字與用戶程序中同名的全
局變數名字不同。
未加extern "C"聲明時的連接方式
假設在C 中,模塊A 的頭文件如下:
// 模塊A 頭文件 moleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
在模塊B 中引用該函數:
// 模塊B 實現文件 moleB.cpp
#i nclude "moleA.h"
foo(2,3);
實際上,在連接階段,連接器會從模塊A 生成的目標文件moleA.obj 中尋找
_foo_int_int 這樣的符號!
加extern "C"聲明後的編譯和連接方式
加extern "C"聲明後,模塊A 的頭文件變為:
// 模塊A 頭文件 moleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
在模塊B 的實現文件中仍然調用foo( 2,3 ),其結果是:
(1)模塊A 編譯生成foo 的目標代碼時,沒有對其名字進行特殊處理,採用了C 語言的
方式;
(2)連接器在為模塊B 的目標代碼尋找foo(2,3)調用時,尋找的是未經修改的符號名_foo。
如果在模塊A 中函數聲明了foo 為extern "C"類型,而模塊B 中包含的是extern int
foo( int x, int y ) ,則模塊B 找不到模塊A 中的函數;反之亦然。
所以,可以用一句話概括extern 「C」這個聲明的真實目的(任何語言中的任何語法特
性的誕生都不是隨意而為的,來源於真實世界的需求驅動。我們在思考問題時,不能只停留
在這個語言是怎麼做的,還要問一問它為什麼要這么做,動機是什麼,這樣我們可以更深入
地理解許多問題):
實現C 與C 及其它語言的混合編程。
明白了C 中extern "C"的設立動機,我們下面來具體分析extern "C"通常的使用技巧。
4.extern "C"的慣用法
(1)在C 中引用C 語言中的函數和變數,在包含C 語言頭文件(假設為cExample.h)
時,需進行下列處理:
extern "C"
{
#i nclude "cExample.h"
}
而在C 語言的頭文件中,對其外部函數只能指定為extern 類型,C 語言中不支持extern
"C"聲明,在.c 文件中包含了extern "C"時會出現編譯語法錯誤。
筆者編寫的C 引用C 函數例子工程中包含的三個文件的源代碼如下:
/* c 語言頭文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c 語言實現文件:cExample.c */
#i nclude "cExample.h"
int add( int x, int y )
{
return x y;
}
// c 實現文件,調用add:cppFile.cpp
extern "C"
{
#i nclude "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
如果C 調用一個C 語言編寫的.DLL 時,當包括.DLL 的頭文件或聲明介面函數時,應加
extern "C" 。
(2)在C 中引用C 語言中的函數和變數時,C 的頭文件需添加extern "C",但是在C
語言中不能直接引用聲明了extern "C"的該頭文件,應該僅將C 文件中將C 中定義的extern
"C"函數聲明為extern 類型。
筆者編寫的C 引用C 函數例子工程中包含的三個文件的源代碼如下:
//C 頭文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C 實現文件 cppExample.cpp
#i nclude "cppExample.h"
int add( int x, int y )
{
return x y;
}
/* C 實現文件 cFile.c
/* 這樣會編譯出錯:#i nclude "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
如果深入理解了第3 節中所闡述的extern "C"在編譯和連接階段發揮的作用,就能真正
理解本節所闡述的從C 引用C 函數和C 引用C 函數的慣用法。對第4 節給出的示例代碼,
需要特別留意各個細節。
volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯優化,以免出錯,(VC 在產生release版可執行碼時會進行編譯優化,加volatile關鍵字的變數有關的運算,將不進行編譯優化。)。
例如:
volatile int i=10;
int j = i;
...
int k = i;
volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的地址中讀取,因而編譯器生成的可執行碼會重新從i的地址讀取數據放在k中。
而優化做法是,由於編譯器發現兩次從i讀數據的代碼之間的代碼沒有對i進行過操作,它會自動把上次讀的數據放在k中。而不是重新從i裡面讀。這樣以來,如果i是一個寄存器變數或者表示一個埠數據就容易出錯,所以說volatile可以保證對特殊地址的穩定訪問,不會出錯。
斷言(assert)是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為 true。如果表達式計算為 false,那麼系統會報告一個 Assertionerror。它用於調試目的:
assert(a
『肆』 C語言問題:為什麼函數調用的這句delnum(item);改成void delnum(char *item)就不對呢
void delnum(char *item)
是聲明. 不會調用函數.
delnum(item);
才是調用,真正會執行delnum
『伍』 用C語言代碼實現在順序表L的第i個位置插入數據item,並分析該演算法的時間復雜度
從最後一個位置依次向後移 第i個位置移到第i+1個位置後 把新元素放到第i個位置
『陸』 c語言中「Item這個是什麼意思
%c是字元型,%ch則是輸入一個字元後,必須加上一個h
比如想輸入A,實際上需要輸入Ah,這個非格式字元在輸入時必須原樣輸入,輸出是會原樣輸出
『柒』 c語言中i和item的區別
i,item都是定義的變數而已
比如
int i,
int item
其實你可以隨便起名字的,變數名字而已
int fuck都行的
『捌』 C++ 中這個Item到底是什麼意思
由於反大括弧後面直接是分號,因此這組語句只是定義了一個結構Node的組成,並未分配任何可用的變數空間,分配空間的方法比如:
struct Node {
Item item;
struct Node* next;
} a; //定義結構a,可用a.item和a.next訪問其內部變數
void main() { struct Node b,*c; //定義結構b和一個可用指向Node類型結構的指針c
a.next=NULL; //訪問舉例
b.next=NULL; //訪問舉例
c=&a; c->next=&b; //用指針訪問結構a中的next變數
}