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

c語言復合的數值運算符

發布時間: 2022-09-18 13:59:24

A. 什麼是復合算術賦值符,求復合算術賦值運算符的詳解

在賦值運算符當中,有一類C/C++獨有的復合賦值運算符。它們實際上是一種縮寫形式,使得對變數的改變更為簡潔。
Total=Total+3;
它的意思是本身的值加3,然後在賦值給本身。為了簡化,上面的代碼也可以寫成:
Total+=3;
同樣,x*=y+7
等價於x=x*(y+7)r%=p
等價於r=r%p
復合賦值運算符有下列這些:
符號
功能
+=
加法賦值
-=
減法賦值
*=
乘法賦值
/=
除法賦值
%=
模運算賦值
<<=
左移賦值
>>=
右移賦值
&=
位邏輯與賦值
|=
位邏輯或賦值
^=
位邏輯異或賦值
那麼看了上面的復合賦值運算符,有人就會問,到底Total=Total+3;與Total+=3;有沒有區別?答案是有的,對於A=A+1,表達式A被計算了兩次,對於復合運算符A+=1,表達式A僅計算了一次。一般的來說,這種區別對於程序的運行沒有多大影響,但是當表達式作為函數的返回值時,函數就被調用了兩次(以後再說明),而且如果使用普通的賦值
運算符,也會加大程序的開銷,使效率降低。

B. c語言的復合賦值運算符

A=A+1,首先要求賦值號右側的表達式A的值,然後將它與1相加,接著求賦值號左側的表達式A的值,最後將加法的結果寫回A中,所以表達式A被求值了兩次;A+=1,首先求得賦值號左側的表達式A的值,將這個值加上1,然後寫回A中,表達式A只被求值了一次。
這是理想的情況,實際中現代編譯器都非常智能,在開啟編譯優化時,A=A+1這樣的語句將被直接優化為A+=1甚至是A++。

C. 近來在學習C語言,想知道C中復合賦值運算符 :& , | 分別表示什麼啊 請高手指點,最好能舉例來說明!

他們屬於位操作符。他們分別執行AND、OR操作。它們要求操作數為整數類型,對操作數對應的位進行指定的操作,這里還有一個" ^ " 操作符,它表示異或(XOR)操作。
例:
假定變數a 的二進制值為00101110,
變數b的二進制值為01011011。
a & b 的結果是 00001010,
a | b的結果是 01111111,
a ^ b 的結果是011110101。

D. 復合賦值運算符講解

位運算符
學過匯編的朋友都知道匯編對位的處理能力是很強的,但是C語言也能對運算對象進行按位操作,從而使C語言也能具有一定的對硬體直接進行操作的能力。位運算符的作用是按位對變數進行運算,但是並不改變參與運算的變數的值。如果要求按位改變變數的值,則要利用相應的賦值運算。還有就是位運算符是不能用來對浮點型數據進行操作的。C51中共有6種位運算符。
位運算一般的表達形式如下:
變數1 位運算符 變數2
位運算符也有優先順序,從高到低依次是:"~"(按位取反)→"<<"(左移) →">>"(右移) →"&"(按位與)→"^"(按位異或)→"|"(按位或)
表7-1是位邏輯運算符的真值表,X表示變數1,Y表示變數2

X Y ~X ~Y X&Y X|Y X^Y
0 0 1 1 0 0 0
0 1 1 0 0 1 1
1 0 0 1 0 1 1
1 1 0 0 1 1 0

表7-1 按位取反,與,或和異或的邏輯真值表

利用以前建立起來的實驗板,我們來做個實驗驗證一下位運算是否真是不改變參與變數的值,同時學習位運算的表達形式。程序很簡單,用P1口做運算變數,P1.0-P1.7對應P1變數的最低位到最高位,通過連接在P1口上的LED我們便可以直觀看到每個位運算後變數是否有改變或如何改變。程序如下:
#include <at89x51.h>
void main(void)
{
unsigned int a;
unsigned int b;
unsigned char temp; //臨時變數
P1 = 0xAA; //點亮D1,D3,D5,D7 P1口的二進制為10101010,為0時點亮LED
for (a=0;a<1000;a++)
for (b=0;b<1000;b++); //延時
temp = P1 & 0x7; //單純的寫P1|0x7是沒有意義的,因為沒有變數被影響,不會被編譯
//執行P1|0x7後結果存入temp,這時改變的是temp,但P1不會被影響。
//這時LED沒有變化,仍然是D1,D3,D5,D7亮
for (a=0;a<1000;a++)
for (b=0;b<1000;b++); //延時
P1 = 0xFF; //熄滅LED
for (a=0;a<1000;a++)
for (b=0;b<1000;b++); //延時
P1 = 0xAA; //點亮D1,D3,D5,D7 P1口的二進制為10101010,為0時點亮LED
for (a=0;a<1000;a++)
for (b=0;b<1000;b++); //延時
P1 = P1 & 0x7; //這時LED會變得只有D2滅
//因為之前P1=0xAA=10101010
//與0x7位與 0x7=00000111
//結果存入P1 P1=00000010 //位為O時點亮LED,電路看第三課
for (a=0;a<1000;a++)
for (b=0;b<1000;b++); //延時
P1 = 0xFF; //熄滅LED
while(1);
//大家可以根據上面的程序去做位或,左移,取反等等。
}

復合賦值運算符
復合賦值運算符就是在賦值運算符"="的前面加上其他運算符。以下是C語言中的復合賦值運算符:
+= 加法賦值 >>= 右移位賦值
-= 減法賦值 &= 邏輯與賦值
*= 乘法賦值 |= 邏輯或賦值
/= 除法賦值 ^= 邏輯異或賦值
%= 取模賦值 -= 邏輯非賦值
<<= 左移位賦值

復合運算的一般形式為:
變數 復合賦值運算符 表達式

其含義就是變數與表達式先進行運算符所要求的運算,再把運算結果賦值給參與運算的變數。其實這是C語言中一種簡化程序的一種方法,凡是二目運算都可以用復合賦值運算符去簡化表達。例如:
a+=56等價於a=a+56
y/=x+9 等價於 y=y/(x+9)
很明顯採用復合賦值運算符會降低程序的可讀性,但這樣卻可以使程序代碼簡單化,並能提高編譯的效率。對於初學C語言的朋友在編程時最好還是根據自己的理解力和習慣去使用程序表達的方式,不要一味追求程序代碼的短小。

逗號運算符
如果你有編程的經驗,那麼對逗號的作用也不會陌生了。如在VB中"Dim a,b,c"的逗號就是把多個變數定義為同一類型的變數,在C也一樣,如"int a,b,c",這些例子說明逗號用於分隔表達式用。但在C語言中逗號還是一種特殊的運算符,也就是逗號運算符,可以用它將兩個或多個表達式連接起來,形成逗號表達式。逗號表達式的一般形式為:
表達式1,表達式2,表達式3……表達式n
這樣用逗號運算符組成的表達式在程序運行時,是從左到右計算出各個表達式的值,而整個用逗號運算符組成的表達式的值等於最右邊表達式的值,就是"表達式n"的值。在實際的應用中,大部分情況下,使用逗號表達式的目的只是為了分別得到名個表達式的值,而並不一定要得到和使用整個逗號表達式的值。要注意的還有,並不是在程序的任何位置出現的逗號,都可以認為是逗號運算符。如函數中的參數,同類型變數的定義中的逗號只是用來間隔之用而不是逗號運算符。

條件運算符
上面我們說過C語言中有一個三目運算符,它就是"?:"條件運算符,它要求有三個運算對象。它可以把三個表達式連接構成一個條件表達式。條件表達式的一般形式如下:
邏輯表達式? 表達式1 : 表達式2
條件運算符的作用簡單來說就是根據邏輯表達式的值選擇使用表達式的值。當邏輯表達式的值為真時(非0值)時,整個表達式的值為表達式1的值;當邏輯表達式的值為假(值為0)時,整個表達式的值為表達式2的值。要注意的是條件表達式中邏輯表達式的類型可以與表達式1和表達式2的類型不一樣。下面是一個邏輯表達式的例子。

如有a=1,b=2這時我們要求是取ab兩數中的較小的值放入min變數中,也許你會這樣寫:
if (a<b)
min = a;
else
min = b; //這一段的意思是當a<b時min的值為a的值,否則為b的值。

用條件運算符去構成條件表達式就變得簡單明了了:
min = (a<b)?a : b
很明顯它的結果和含意都和上面的一段程序是一樣的,但是代碼卻比上一段程序少很多,編譯的效率也相對要高,但有著和復合賦值表達式一樣的缺點就是可讀性相對效差。在實際應用時根據自己要習慣使用,就我自己來說我喜歡使用較為好讀的方式和加上適當的註解,這樣可以有助於程序的調試和編寫,也便於日後的修改讀寫。

指針和地址運算符
在第四課我們學習數據類型時,學習過指針類型,知道它是一種存放指向另一個數據的地址的變數類型。指針是C語言中一個十分重要的概念,也是學習C語言中的一個難點。對於指針將會在第九課中做詳細的講解。在這里我們先來了解一下C語言中提供的兩個專門用於指針和地址的運算符:
* 取內容
& 取地址
取內容和地址的一般形式分別為:
變數 = * 指針變數
指針變數 = & 目標變數

取內容運算是將指針變數所指向的目標變數的值賦給左邊的變數;取地址運算是將目標變數的地址賦給左邊的變數。要注意的是:指針變數中只能存放地址(也就是指針型數據),一般情況下不要將非指針類型的數據賦值給一個指針變數。
下面來看一個例子,並用一個圖表和實例去簡單理解指針的用法和含義。

設有兩個unsigned int 變數 ABC處CBA 存放在0x0028,0x002A中

另有一個指針變數 portA 存放在0x002C中

那麼我們寫這樣一段程序去看看*,&的運算結果

unsigned int data ABC _at_ 0x0028;

unsigned int data CBA _at_ 0x002A;

unsigned int data *Port _at_ 0x002C;

#include <at89x51.h>

#include <stdio.h>

void main(void)

{

SCON = 0x50; //串口方式1,允許接收

TMOD = 0x20; //定時器1定時方式2

TH1 = 0xE8; //11.0592MHz 1200波特率

TL1 = 0xE8;

TI = 1;

TR1 = 1; //啟動定時器

ABC = 10; //設初值

CBA = 20;

Port = &CBA; //取CBA的地址放到指針變數Port

*Port = 100; //更改指針變數Port所指向的地址的內容

printf("1: CBA=%d\n",CBA); //顯示此時CBA的值

Port = &ABC; //取ABC的地址放到指針變數Port

CBA = *Port; //把當前Port所指的地址的內容賦給變數CBA

printf("2: CBA=%d\n",CBA); //顯示此時CBA的值

printf(" ABC=%d\n",ABC); //顯示ABC的值

}

程序初始時


地址
說明

0x00
0x002DH

0x00
0x002CH

0x00
0x002BH

0x00
0x002AH

0x0A
0x0029H

0x00
0x0028H

執行ABC = 10;向ABC所指的地址0x28H寫入10(0xA),因ABC是int類型要佔用0x28H和0x29H兩個位元組的內存空間,低位位元組會放入高地址中,所以0x28H中放入0x00,0x29H中放入0x0A


地址
說明

0x00
0x002DH

0x00
0x002CH

0x00
0x002BH

0x00
0x002AH

0x0A
0x0029H
ABC為int類型佔用兩位元組

0x00
0x0028H

執行CBA = 20;原理和上一句一樣


地址
說明

0x00
0x002DH

0x00
0x002CH

0x14
0x002BH
CBA為int類型佔用兩位元組

0x00
0x002AH

0x0A
0x0029H
ABC為int類型佔用兩位元組

0x00
0x0028H

執行Port = &CBA; 取CBA的首地址放到指針變數Port


地址
說明

0x00
0x002DH

0x2A
0x002CH
CBA的首地址存入Port

0x14
0x002BH

0x00
0x002AH

0x0A
0x0029H

0x00
0x0028H

*Port = 100; 更改指針變數Port所指向的地址的內容


地址
說明

0x00
0x002DH

0x2A
0x002CH

0x64
0x002BH
Port指向了CBA所在地址2AH

0x00
0x002AH
並存入100

0x0A
0x0029H

0x00
0x0028H

其它的語句也是一樣的道理,大家可以用Keil的單步執行和打開存儲器查看器一看,這樣就更容易理解了。

圖7-6 存儲器查看窗

圖7-7 在串列調試窗口的最終結果

sizeof運算符
看上去這確實是個奇怪的運算符,有點像函數,卻又不是。大家看到size應該就猜到是和大小有關的吧?是的,sizeof是用來求數據類型、變數或是表達式的位元組數的一個運算符,但它並不像"="之類運算符那樣在程序執行後才能計算出結果,它是直接在編譯時產生結果的。它的語法如下:
sizeof (數據類型)
sizeof (表達式)
下面是兩句應用例句,程序大家可以試著編寫一下。
printf("char是多少個位元組? %bd 位元組\n",sizeof(char));
printf("long是多少個位元組? %bd 位元組\n",sizeof(long));

結果是:
char是多少個位元組? 1位元組
long是多少個位元組? 4位元組

強制類型轉換運算符
不知你們是否有自己去試著編一些程序,從中是否有遇到一些問題?初學時我就遇到過這樣一個問題:兩個不同數據類型的數在相互賦值時會出現不對的值。如下面的一段小程序:
void main(void)
{
unsigned char a;
unsigned int b;

b=100*4;
a=b;
while(1);
}
這段小程序並沒有什麼實際的應用意義,如果你是細心的朋友定會發現a的值是不會等於100*4的。是的a和b一個是char類型一個是int類型,從以前的學習可知char只佔一個位元組值最大隻能是255。但編譯時為何不出錯呢?先來看看這程序的運行情況:

圖7-8 小程序的運行情況

b=100*4就可以得知b=0x190,這時我們可以在Watches查看a的值,對於watches窗口我們在第5課時簡單學習過,在這個窗口Locals頁里可以查看程序運行中的變數的值,也可以在watch頁中輸入所要查看的變數名對它的值進行查看。做法是按圖中1的watch#1(或watch#2),然後游標移到圖中的2按F2鍵,這樣就可以輸入變數名了。在這里我們可以查看到a的值為0x90,也就是b的低8位。這是因為執行了數據類型的隱式轉換。隱式轉換是在程序進行編譯時由編譯器自動去處理完成的。所以有必要了解隱式轉換的規則:
1.變數賦值時發生的隱式轉換,"="號右邊的表達式的數據類型轉換成左邊變數的數據類型。就如上面例子中的把INT賦值給CHAR字元型變數,得到的CHAR將會是INT的低8位。如把浮點數賦值給整形變數,小數部分將丟失。
2.所有char型的操作數轉換成int型。
3.兩個具有不同數據類型的操作數用運算符連接時,隱式轉換會按以下次序進行:如有一操作數是float類型,則另一個操作數也會轉換成float類型;如果一個操作數為long類型,另一個也轉換成long;如果一個操作數是unsigned類型,則另一個操作會被轉換成unsigned類型。
從上面的規則可以大概知道有那幾種數據類型是可以進行隱式轉換的。是的,在C51中只有char,int,long及float這幾種基本的數據類型可以被隱式轉換。而其它的數據類型就只能用到顯示轉換。要使用強制轉換運算符應遵循以下的表達形式:

(類型) 表達式

用顯示類型轉換來處理不同類型的數據間運算和賦值是十分方便和方便的,特別對指針變數賦值是很有用的。看一面一段小程序:

#include <at89x51.h>
#include <stdio.h>

void main(void)
{
char xdata * XROM;
char a;
int Aa = 0xFB1C;
long Ba = 0x893B7832;
float Ca = 3.4534;
SCON = 0x50; //串口方式1,允許接收
TMOD = 0x20; //定時器1定時方式2
TH1 = 0xE8; //11.0592MHz 1200波特率
TL1 = 0xE8;
TI = 1;
TR1 = 1; //啟動定時器
XROM=(char xdata *) 0xB012; //給指針變數賦XROM初值
*XROM = 'R'; //給XROM指向的絕對地址賦值
a = *((char xdata *) 0xB012); //等同於a = *XROM
printf ("%bx %x %d %c \n",(char) Aa, (int) Ba,(int)Ca, a);//轉換類型並輸出
while(1);
}

程序運行結果:1c 7832 3 R

在上面這段程序中,可以很清楚到到各種類型進行強制類型轉換的基本用法,程序中先在外部數據存儲器XDATA中定義了一個字元型指針變數XROM,當用XROM=(char xdata *) 0xB012這一語句時,便把0xB012這個地址指針賦於了XROM,如你用XROM則會是非法的,這種方法特別適合於用標識符來存取絕對地址,如在程序前用#define ROM 0xB012這樣的語句,在程序中就可以用上面的方法用ROM對絕對地址0xB012進行存取操作了。

在附錄三中運算符的優先順序說明。

在這課的完結後,C語言中一些數據類型和運算規律已基本學習完了,下一課會開始講述語法,函數等。

示常式序下載
附 錄

E. C語言34種運算符

34種運算符:

01、圓括弧()

02、下標[]

03、指針型結構成員->

04、結構成員.

05、邏輯非!

06、位非~

07、自增++

08、自減--

09、取負-

10、類型轉換(類型)

11、取內容*

12、取地址&

13、求位元組sizeof

14、乘*

15、除/

16、求余%

17、加+

18、減-

19、左移<<

20、右移>>

21、小於<

22、小於等於<=

23、大於>

24、大於等於>=

25、等於==

26、不等於!=

27、位與&

28、位異或^

29、位或|

30、&&與

31、或||

32、條件運算?:

33、賦值運算=

34、逗號運算,

(5)c語言復合的數值運算符擴展閱讀

9種控制語句

1、if()~else條件語句

2、for()~循環語句

3、while()~循環語句

4、do~while()循環語句

5、continue結束本次循環語句

6、break中止執行switch或循環語句

7、switch多分支選擇語句

8、goto轉向語句

9、return從函數返回語句

F. 在C語言中復合賦值運算符有什麼樣的作用

在賦值運算符當中,還有一類C/C++獨有的復合賦值運算符。它們實際上是一種縮寫形式,使得對變數的改變更為簡潔。
Total=Total+3;
乍一看這行代碼,似乎有問題,這是不可能成立的。其實還是老樣子,'='是賦值不是等於。它的意思是本身的值加3,然後在賦值給本身。為了簡化,上面的代碼也可以寫成:
Total+=3;
復合賦值運算符有下列這些:符號 功能
+=加法賦值 =減法賦值 *=乘法賦值 /=除法賦值 %=模運算賦值 左移賦值 ルAA
右移賦值 &=
位邏輯與賦值 位邏輯或賦值 =1
=位邏輯異或賦值
上面的十個復合賦值運算符中,後面五個我們到以後位運算時再說明。那麼看了上面的復合賦值運算符,有人就會問,到底Total=Total+3;與Tota
tal+=3;
有沒有區別? 答案是有的,對於A=
A=A+1
+1,表達式A被計算了兩次,對於復合運算符
A+=1
,表達式A僅計 算了一次。一般的來說,這種區別對於程序的運行沒有多大影響,但是當表達式作為函數的返回值時,函數就被調用了兩次(以後再說明),而且如果使用普通的賦值運算符,也會加大程序的開銷,使效率降低。

G. c語言基礎:復合賦值運算符

首先明白優先順序順序,從上往下依次降低

所以,題目中,先計算a-6,再計算a/=,然後a*=,最後a+=

例如,a=7

則:

1.a+=a*=a/=1

a/=1即a=a/1=7/1=7

2.a+=a*=7 現在a=7

3.a+=49 現在a=49

4.a=49+49=98

H. c語言,復合賦值運算符

首先+=和*=優先順序相同,且都是右結合,所以上述語句等價於:
k += ( i *= k);
等價於:
i *= k; // i = i*k
k += i; // k = k+ i;

I. 這些 C語言的復合賦值符運算符 代表撒啊謝謝 我在線等 順帶幫我每個舉個例子算下

除了 != 意思是不等於外,另外幾個看以下說明:
=號前加運算符,表示先進行這個運算,再賦值,比如a+=b,意思就是a=a+b

以下均以值為二進制數101的變數a說明
<<、>>是移位運算符 a<<=1 --> a=1010, a>>=1 --> a=10
&:按位與 a&=110 --> a=100
^:按位異或 a^=010 --> a=111

%是模運算,簡單來說就是要得到余數,比如10%3=1