首頁 > 軟體

C語言各種操作符透徹理解下篇

2022-02-09 13:00:28

1.單目操作符

之前有了解到的三目操作符(?:),指的是有三個運算元

例如:3+5

其中,+是一個操作符

3是左運算元

5是有運算元

+則是一個雙目操作符

那麼什麼是單目操作符呢,也就是隻有一個運算元的

我們常見的操作符有:

 這裡我們來詳細介紹一下sizeof、~、++與--

1.sizeof

sizeof常用來計算型別的長度,比如陣列型別,int、char、short等等。同時,sizeof是操作符,不是函數,所以後面的括號可以省略。但算型別長度的時候不能省,這是語法要求。

下面就是sizeof一些常用的用法

#include<stdio.h>
int main()
{
	//sizeof
	int a = 10;
	printf("%dn", sizeof(a));
	printf("%dn", sizeof(int));
	printf("%dn", sizeof(float));
	printf("%dn", sizeof(double));
 
	int arr[10] = { 1,2,3,4,5,6,7 };
	printf("%dn", sizeof(arr));
	printf("%dn", sizeof(int[10]));//計算整個陣列的長度
 
	printf("%dn", sizeof a);
	//printf("%dn", sizeof int);這樣寫是會報錯的
 
 
	return 0;
}

計算出的結果如下:

2.~

~的主要作用就是對一個數的二進位制按位元取反,但同樣的,最後列印出來的是原碼

#include<stdio.h>
int main()
{
    int a = 0;
	//~按(記憶體中二補數的2進位制)位取反
	//00000000000000000000000000000000
	//11111111111111111111111111111111 - 二補數
	//11111111111111111111111111111110 - 反碼
	//10000000000000000000000000000001 - 原碼 --> -1
 
	printf("%dn", ~a);
 
	return 0;
}

執行結果如下:

 這裡有個~的應用:

怎樣將一個數進行復原

#include<stdio.h>
int main()
{
    int a = 10;
	a |= (1 << 2);
	printf("%dn", a);
	a &= ~(1 << 2);
	printf("%dn", a);
    return 0;
 
	//如果只想把倒數第三個數,也就是0改為1,可以進行以下操作
	//00000000000000000000000000001010
	//00000000000000000000000000000100   1<<2(用a與1<<2互斥或來實現)
	//00000000000000000000000000001110
	//11111111111111111111111111111011   ~(1<<2)(要想將a復原,就是再將倒數第三個數變為0)
	//00000000000000000000000000001010
}

3.++與--

這裡主要注意的是分前置與後置

前置++/--:先加/減再使用

後置++/--:先使用再加/減 

a每加一次就會記錄,總共加了兩次,所以是3。

對於b,先使用了a的值再對a進行++,所以是1.

到c這裡,a實際上已經變成2了,而c是先對a進行加1再用它的值,所以c為3。

4.*(解除參照操作符)

#include<stdio.h>
int main()
{
    int a = 10;
	int* pa = &a;
	*pa = 20;//通過*來存取a的地址
	printf("%dn", a);
	printf("%dn", *pa);//此時的*pa就是a的值
 
	int* px = &*pa;//px通過*來存取*pa,也就是存取a
	*px = 30;
	printf("%dn", a);
    return 0;
}

2.關係操作符

3.邏輯操作符

(只關注變數的真假)

來看一道360的筆試題,判斷一下程式輸出的結果是多少。

我們先來看下第一種,a是先使用再進行++,這裡a是0,是0則為假,那麼後面的就都不要看了,還是原來的結果,但a進行了++ 

 再看第二種,先打個比方,我想讓張三或者李四,一個來我辦公室,張三來了,那李四來不來就已經無所謂了,這裡也是一樣,a先使用再++,則a=0,表示沒有人來,沒人來就繼續進行,b是先++再使用,b=3,為真,就是有人來了,有人來了以後,後面的來不來都無所謂,所以d就不再進行,最後輸出的結果就是1334.

 (做個小總結:&&---左運算元為假,右邊不計算     ||---左運算元為真,右邊不計算

4.條件操作符

(也叫三目操作符--->exp1 ? exp2 : exp3 )

#include<stdio.h>
int main()
{
    int a = 10;
	int b = 20;
	int max = 0;
	/*if (a > b)
		max = a;
	else
		max = b;*/
 
	max = (a > b ? a : b);//與上面那段程式碼等價
    return 0;
}

5.逗號表示式

逗號表示式,就是用逗號隔開的多個表示式。 逗號表示式從左向右依次執行。整個表示式的結果是最後一個表示式的結果。 首先,我們來分析一個程式碼: 下面輸出的c是多少?

    int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);

我們來看括號裡面的式子,像a>b、a這樣子的對a和b毫不起作用,可以直接忽略掉,然後a=b+10,這裡a變成了12,最後b=a+1=13.所以結果是13.

不難發現,最後起作用的是最後一個表示式的結果。

6.下標參照、函數呼叫和結構成員

1. [  ] 下標參照操作符

運算元:一個陣列名+一個索引值

 2.( )函數呼叫操作符

接受一個或者多個運算元:第一個運算元是函數名,剩餘的運算元就是傳遞給函數的引數。

#include<stdio.h>
 
void menu()
{
    printf("*************************n");
	printf("******    hello    ******n");
	printf("******   friends   ******n");
	printf("*************************n");
}
 
int main()
{
    menu();
    return 0;
}

 3.存取一個結構的成員

. 結構體.成員名

-> 結構體指標->成員名

#include<stdio.h>
 
struct Stu
{
    char name[10];
    int age;
    double score;
};
 
int main()
{
    struct Stu s = { "zhangsan",20,85.5 };
	//.
	printf("%s %d %.1lfn", s.name, s.age, s.score);
	//->
	struct Stu* ps = &s;
	printf("%s %d %.1lfn", (*ps).name, (*ps).age, (*ps).score);
	printf("%s %d %.1lfn", ps->name, ps->age, ps->score);
    return 0;
}

這三種情況輸出的結果一樣,感興趣的同學可以自己去試一下!

7.隱式型別轉換

例如:

#include<stdio.h>
int main()
{
    short s = 20;
	int a = 5;
	printf("%dn", sizeof(s = a + 4));
	printf("%dn", s);
    return 0;
}

sizeof輸出的結果是2,這裡面int型的a被轉化為short型。

8.操作符的屬性

複雜表示式的求值有三個影響的因素:

1.操作符的優先順序

2.操作符的結合性

3.是否控制求值順序

兩個相鄰的操作符先執行哪個,取決於他們的優先順序。如果兩者的優先順序相同,取決於他們的結合性。

// 表示式的求值部分由操作符的優先順序決定。

// 表示式 1

a * b + c * d + e * f

在計算的時候,由於*比+的優先順序高,只能保證,*的計算是比+早,但是優先順序並不

能決定第三個 * 比第一個 + 早執行。

// 表示式2

c + -- c ;

同上,操作符的優先順序只能決定自減-- 的運算在 + 的運算的前面,但是我們並沒有辦法得 知,+操作符的左運算元的獲取在右運算元之前還是之後求值,所以結果是不可預測的,是有歧義 的。

// 程式碼 3- 非法表示式

int main ()

{

int i = 10 ;

i = i -- - -- i * ( i = - 3 ) * i ++ + ++ i ;

printf ( "i = %dn" , i );

return 0 ;

}

我們在寫程式碼的時候,難免會為一些小細節而頭痛,只有在我們熟練掌握這些知識的時候才能避免這些尷尬的小問題,希望操作符詳解能對你有些幫助!

到此這篇關於C語言各種操作符透徹理解下篇的文章就介紹到這了,更多相關C語言 操作符內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com