當前位置:首頁 » 編程語言 » c語言運算符重載
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言運算符重載

發布時間: 2022-09-05 13:06:59

c語言可不可以重載

1.從C語言的語法設計來說是不支持的,早期的C編譯器未考慮過函數重載這一功能,所以就會有那麼多類似的函數abs,labs,fabs等等(每種類型都要考慮一個不同的函數名)。
2.C語言標准就規定不允許同一作用域中兩個函數重名。和C語言相關的域有兩種,一個是給編譯器看得,還有一種是給鏈接器看的,而給編譯器看的這種域主要是關於
變數的可見范圍,而鏈接器看到的那個是叫文件域,而全局域可能要跨越好幾個文件域,這樣只要兩個同名函數用static修飾,並且在不同的文件中,就不會
沖突。不過這個實際上已經超越了編譯器的范圍,表面看起來兩個函數同名,但是實際上編譯器為鏈接器產生是指向的同一個函數地址。
3.函數重載是一個編譯期行為,主要是通過name mangling來產生不同的匯編符號,讓linker可以正確的link代碼。
4.但是,C語言作為一個具有超強功能的底層語言,是有辦法進行模擬函數重載的。那就是函數指針。最簡單的例子就是qsort函數。這個函數可以傳遞一個函數指針變數,通過不同的函數指針,可以對不同的數據類型就行相同的qsort操作,從某種層面來說相當於函數重載。

② c語言中,!(--x)什麼意思

C語言運算符,括弧裡面(---x)表示x的值減去1,相當於「x」變為「x-1」,括弧外面「!」表示取反(非0數變為0,0變為1)。

除了常見的三大類,算術運算符、關系運算符與邏輯運算符之外,還有一些用於完成特殊任務的運算符,比如位運算符。



(2)c語言運算符重載擴展閱讀


優先順序,C語言中,運算符的運算優先順序共分為15 級。1 級最高,15 級最低。 在表達式中,優先順序較高的先於優先順序較低的進行運算。而在一個運算量兩側的運算符 優先順序相同時,則按運算符的結合性所規定的結合方向處理。

結合性:C語言中各運算符的結合性分為兩種,即左結合性(自左至右)和右結合性(自右至左)。例如算術運算符的結合性是自左至右,即先左後右。如有表達式x-y+z 則y 應先與「-」號結合,執行x-y 運算,然後再執行+z 的運算。這種自左至右的結合 方向就稱為「左結合性」。

而自右至左的結合方向稱為「右結合性」。最典型的右結合 性運算符是賦值運算符。如x=y=z,由於「=」的右結合性,應先執行y=z 再執行x=(y=z)運算。C語言運算符中有不少為右結合性,應注意區別,以避免理解錯誤。

優先順序從上到下依次遞減,最上面具有最高的優先順序,逗號操作符具有最低的優先順序。所有的優先順序中,只有三個優先順序是從右至左結合的,它們是單目運算符、條件運算符、賦值運算符。其它的都是從左至右結合。

具有最高優先順序的其實並不算是真正的運算符,它們算是一類特殊的操作。()是與函數相關,[]與數組相關,而->及.是取結構成員。

其次是單目運算符,所有的單目運算符具有相同的優先順序,因此在我認為的 真正的運算符中它們具有最高的優先順序,又由於它們都是從右至左結合的,因此*p++與*(p++)等效是毫無疑問的。

另外在C語言里,沒有前置後置之分,因為++ -- 是右結合所以右側優先運算,表現為 "操作數後置優先順序比較高" 的假象,前置和後置的區分是因為運算符重載而後加入C++的

接下來是算術運算符,*、/、%的優先順序當然比+、-高了。

③ C語言重載運算符

1、c語言是沒有面向對象的,沒有class這個關鍵詞,而且也沒有運算符重載,我估計你用的是vc編程環境吧。2、A &指的是引用,如果不用引用就會有實參形參的說法,形參的修改不會影響實參的值,如果用引用,實參和形參就指的是同一個變數,形參修改實參即修改

④ C語言實現一個數組類運算符重載的問題

//arry.h
class arry {
int *pt; //數組指針
int length; //數組長度
public:
arry &operator+(const arry&);
//+運算符重載 實現兩個數組的連接:int A[]={1,2,3};
//
......//int B[]={4,5,6};A+b={1,2,3,4,5,6}
}
//arry.c
.......
arry &arry::operator+(const arry &a) {
int *temp = new int[length + a.length];
for(int i = 0;i < length;i++) temp[i] = pt[i];
for(i = 0;i < a.length;i++) temp[i + length] = a.pt[i];
delete []pt; // 釋放原空間
pt = temp; // 重置指針
length += pt,length; // 修改數據成員
return *this; // 返回自身
}

⑤ C語言編程 下面什麼意思


總的來說要保證你重載的運算符和已經存在的運算符在使用語境上沒有區別 舉兩個例子
一般返回值還要繼續被處理的情況 返回引用 比如+=運算符可以這樣用
a += b += c;
那麼+=就應該返回自身的引用 通常是 return *this;
返回值用過就丟棄的應該返回 值類型 比如+運算一般這樣用
a = (b + c) * d;
這里b+c的值在運算之後就丟棄了 所以返回值類型 通常是return ClassA(result_of_operation);

運算符重載是個比較麻煩的東西 但是Effective C++裡面講的很清楚 你應該仔細看看那本書

⑥ c語言問題:下圖是什麼意思賦值運算符重載格式不是這樣啊

像構造函數一樣,一個類可以有多個operator=
這個是定義把一個int整數賦值給一個A類對象的的操作,而不是把一個A類對象賦值給A類對象的操作
你說的格式大概是這樣:
A& A::operator=(const A& a) //A類之間的賦值
{......}

⑦ c++重載運算符的作用是什麼

就是可以定義新的運算方法,比如虛數的+、-法,你定義2個虛數,直接用+是不行的,系統不認,你必須自己寫個重載,讓實部和實部相加,虛部和虛部相加,你先了解下什麼叫函數重載就能更好理解了。

⑧ c語言中a%2=1與a%2==1的區別,用法。謝謝!

a==1?1:2在c語言中的意思是說如果a等於1是成立的話,那麼a的結果就是為1,但是如果a等於1的等式不成立的時候,那麼a的結果就為2。

這樣的式子在C語言中,屬於關系運算符中的三目運算符,三目運算符就是當等式成立結果為?後面的值,當不成立時,選擇:後的值。等式?條件1:條件2。

(8)c語言運算符重載擴展閱讀

分類和級別:

C語言的運算符主要用於構成表達式,同一個符號在不同的表達式中,其作用並不一致。下面按計算的優先順序,分別說明不同作用的表達式。需要特別指出,在C語言標准中,並沒有結合性的說法。

相同優先順序運算符,從左至右依次運算。注意後綴運算優先順序高於前綴。因此++i++應解釋為++(i++)。

而與或非的運算優先順序都不一樣,因此a && b || b && c解釋為(a && b) || (b && c)

合理使用優先順序可以極大簡化表達式。

基本表達式 1級

基本表達式,主要是用於運算符之間,做為運算數。

標識,常量,字元串文字量,優先順序提升表達式最優先執行。

優先順序提升表達式是指圓括弧包圍的表達式。

後綴表達式 2級

postfix-expression [ expression ],數組下標運算。

postfix-expression ( argument-expression-list),函數調用,括弧內的參數可選。

postfix-expression . identifier,成員訪問

postfix-expression -> identifier,成員訪問,->號之前應為指針。

postfix-expression ++,後綴自增。

postfix-expression --,後綴自減。

單目/一元運算 3級

++ unary-expression 前綴自增。

-- unary-expression 前綴自減。

unary-operator cast-expression 單目轉型表達式, 包括 取地址& ,提領 * , 正號+ ,負號- 位反~ 邏輯否。

sizeof unary-expression 求類型長度,對表達式求類型長度。

sizeof ( type-name ) 求類型長度。

強制類型表達式 4級

( type-name ) cast-expression,強製表達式成為type-name指定的類型。

乘法表達式 5級

「 * 」 乘法運算符;「 / 」除法運算符;「 % 」 取余運算符。

加法運算符 6級

「 + 」加法運算符;「 - 」減法運算符。

移位運算符 7級

<< 左移運算符;>> 右移運算符。

關系運算符 8級

<、<=、>、>=關系運算符。

相等運算符 9級

「 == 」等於運算符;「 != 」不等於運算符。

位與運算符 10級

「 & 」按位與運算符。

位異或運算符 11級

「 ∧ 」按位異或運算符(Bitwise exclusive OR operator)。

位或運算符 12 級

「 | 」按位或運算符(Bitwise inclusive OR operator)。

邏輯與運算符 13級

「&&」邏輯與運算符。

邏輯或運算符 14 級

「 || 」邏輯或運算符。

三元條件運算符 15級

? :條件運算符。

賦值運算符 16 級

=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=賦值運算符。

逗號運算符 17級

「,」逗號運算符。

優先順序:

C語言中,運算符的運算優先順序共分為15 級。1 級最高,15 級最低。 在表達式中,優先順序較高的先於優先順序較低的進行運算。而在一個運算量兩側的運算符 優先順序相同時,則按運算符的結合性所規定的結合方向處理。

結合性:

C語言中各運算符的結合性分為兩種,即左結合性(自左至右)和右結合性(自右至左)。例如算術運算符的結合性是自左至右,即先左後右。如有表達式x-y+z 則y 應先與「-」號結合,執行x-y 運算,然後再執行+z 的運算。這種自左至右的結合 方向就稱為「左結合性」。

而自右至左的結合方向稱為「右結合性」。最典型的右結合 性運算符是賦值運算符。如x=y=z,由於「=」的右結合性,應先執行y=z 再執行x=(y=z)運算。C語言運算符中有不少為右結合性,應注意區別,以避免理解錯誤。

優先順序從上到下依次遞減,最上面具有最高的優先順序,逗號操作符具有最低的優先順序。

所有的優先順序中,只有三個優先順序是從右至左結合的,它們是單目運算符、條件運算符、賦值運算符。其它的都是從左至右結合。

具有最高優先順序的其實並不算是真正的運算符,它們算是一類特殊的操作。()是與函數相關,[]與數組相關,而->及.是取結構成員。

其次是單目運算符,所有的單目運算符具有相同的優先順序,因此在我認為的 真正的運算符中它們具有最高的優先順序,又由於它們都是從右至左結合的,因此*p++與*(p++)等效是毫無疑問的。

另外在C語言里,沒有前置後置之分,因為++ -- 是右結合所以右側優先運算,表現為 "操作數後置優先順序比較高" 的假象,前置和後置的區分是因為運算符重載而後加入C++的,接下來是算術運算符,*、/、%的優先順序當然比+、-高了。

移位運算符緊隨其後。

其次的關系運算符中,< <= > >=要比 == !=高一個級別,不大好理解。

所有的邏輯操作符都具有不同的優先順序(單目運算符除外,!和~)

邏輯位操作符的"與"比"或"高,而"異或"則在它們之間。

跟在其後的&&比||高。

接下來的是條件運算符,賦值運算符及逗號運算符。

在C語言中,只有4個運算符規定了運算方向,它們是&&、| |、條件運算符及賦值運算符。

&&、| |都是先計算左邊表達式的值,當左邊表達式的值能確定整個表達式的值時,就不再計算右邊表達式的值。如 a = 0 && b; &&運算符的左邊位0,則右邊表達式b就不再判斷。

在條件運算符中。如a?b:c;先判斷a的值,再根據a的值對b或c之中的一個進行求值。

賦值表達式則規定先對右邊的表達式求值,因此使 a = b = c = 6,成為可能。

參考資料來自:網路-C語言運算





⑨ 詳解Java和C語言的區別在哪裡

1Java與C語言各自的優勢

C語言是面向過程的語言,執行效率高;Java是面向對象的語言,執行效率比C語言低。

C語言最關鍵的是比Java多了指針,這也說明了Java的健壯性,還有Java的多線程機制使程序可以並行運行,Java程序多用於網路。

C語言的安全性不如Java,C語言沒有Java的垃圾回收機制,申請的空間要手動釋放。

Java的通用性好,可以跨平台直接移植,只要有安裝Java虛擬機(JVM)就可以了。

2Java和C語言誰的通用性會比較好

在速度上,C語言編寫的程序要優於Java,因為Java必須運行在虛擬機的環境中,但是因為虛擬機,Java獲得的平台無關性,而C語言的程序有可能需要重新修改編譯才能實現平台的移植,

另一方面,C語言比Java語言更「底層」,因此可以用C編寫例如硬體的驅動,而Java卻不行。Java和C語言還有個明顯的不同就是C語言注重的是演算法,但是Java卻不一樣,想用的時候導包就可以了。

C語言的演算法很重要,但是Java中的演算法沒有C語言那麼復雜。列印的方法:C語言是printf("??.");而Java是System.out.print("??."),也可以用println,ln表示換行。

Java程序中的基本數據類型(boolean, char, byte, short, int, long, float, double),是對對象的引用;C語言也有許多種基本類型,還有struct, union, enum, 數組和指針。

在Java沒有枚舉、聯合類型。Java採用Unicode字元集,C語言通常採用的是ASCII字元集,A—65,a—97。C語言的變數可以不進行初始化,但Java的變數要進行初始化。

在C語言中,char類型佔一個位元組,在Java中char類型佔2個位元組。

3Java和C語言各自的特徵

Java面向對象的特徵主要有封裝,繼承,多態。類的繼承關系是單一的、非多重的,一個子類只有一個父類,子類的父類又只有一個父類。C語言支持「運算符的重載」,這是它的一個很重要的多態特徵,是數據抽象和泛型編程的利器。它允許直接對對象進行四則運算,正像基本數據類型那樣Java不支持這種多態機制,也是為降低復雜性。

Java可以支持方法重載和重寫,所謂重載就是一個類具備多個相同屬性行為;重寫就是在繼承關系中父類的行為在不同的子類上有不同的實現。在Java中比C語言多了一些修飾符,如訪問修飾符Public(公共的)、Private (私有的)、Protected (受保護的)、默認。

Java有super關鍵字,指代父類對象,通常被用於調用父類的構造方法或一般方法 C語言則沒有super關鍵字,兩者都有this,指代當前對象。

在Java中,除了static、final、private是靜態綁定以外,所有方法一律按動態綁定處理。Java中可以將類組織起來用Package打包,而C語言沒有。

⑩ c語言 運算符重載

c++

class A {
public:
int i, j;

class A & operator + ( class A a1, class A a2 )
{ i = a1.i + a2.i; j = a1.j + a2.j; return * this }

class A & operator - ( class A a1, class A a2 )
{ i = a1.i - a2.i; j = a2.j - a2.j; return * this }
}