您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C語言有哪些操作符,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
之前有了解到的三目操作符(?:),指的是有三個操作數
例如:3+5
其中,+是一個操作符
3是左操作數
5是有操作數
+則是一個雙目操作符
那么什么是單目操作符呢,也就是只有一個操作數的
我們常見的操作符有:
這里我們來詳細介紹一下sizeof、~、++與--
sizeof常用來計算類型的長度,比如數組類型,int、char、short等等。同時,sizeof是操作符,不是函數,所以后面的括號可以省略。但算類型長度的時候不能省,這是語法要求。
下面就是sizeof一些常用的用法
#include<stdio.h> int main() { //sizeof int a = 10; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof(float)); printf("%d\n", sizeof(double)); int arr[10] = { 1,2,3,4,5,6,7 }; printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(int[10]));//計算整個數組的長度 printf("%d\n", sizeof a); //printf("%d\n", sizeof int);這樣寫是會報錯的 return 0; }
計算出的結果如下:
~的主要作用就是對一個數的二進制按位取反,但同樣的,最后打印出來的是原碼
#include<stdio.h> int main() { int a = 0; //~按(內存中補碼的2進制)位取反 //00000000000000000000000000000000 //11111111111111111111111111111111 - 補碼 //11111111111111111111111111111110 - 反碼 //10000000000000000000000000000001 - 原碼 --> -1 printf("%d\n", ~a); return 0; }
運行結果如下:
這里有個~的應用:
怎樣將一個數進行復原
#include<stdio.h> int main() { int a = 10; a |= (1 << 2); printf("%d\n", a); a &= ~(1 << 2); printf("%d\n", a); return 0; //如果只想把倒數第三個數,也就是0改為1,可以進行以下操作 //00000000000000000000000000001010 //00000000000000000000000000000100 1<<2(用a與1<<2異或來實現) //00000000000000000000000000001110 //11111111111111111111111111111011 ~(1<<2)(要想將a復原,就是再將倒數第三個數變為0) //00000000000000000000000000001010 }
這里主要注意的是分前置與后置
前置++/--:先加/減再使用
后置++/--:先使用再加/減
a每加一次就會記錄,總共加了兩次,所以是3。
對于b,先使用了a的值再對a進行++,所以是1.
到c這里,a實際上已經變成2了,而c是先對a進行加1再用它的值,所以c為3。
#include<stdio.h> int main() { int a = 10; int* pa = &a; *pa = 20;//通過*來訪問a的地址 printf("%d\n", a); printf("%d\n", *pa);//此時的*pa就是a的值 int* px = &*pa;//px通過*來訪問*pa,也就是訪問a *px = 30; printf("%d\n", a); return 0; }
(只關注變量的真假)
來看一道360的筆試題,判斷一下程序輸出的結果是多少。
我們先來看下第一種,a是先使用再進行++,這里a是0,是0則為假,那么后面的就都不要看了,還是原來的結果,但a進行了++
再看第二種,先打個比方,我想讓張三或者李四,一個來我辦公室,張三來了,那李四來不來就已經無所謂了,這里也是一樣,a先使用再++,則a=0,表示沒有人來,沒人來就繼續進行,b是先++再使用,b=3,為真,就是有人來了,有人來了以后,后面的來不來都無所謂,所以d就不再進行,最后輸出的結果就是1334.
(做個小總結:&&---左操作數為假,右邊不計算 ||---左操作數為真,右邊不計算)
(也叫三目操作符--->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; }
逗號表達式,就是用逗號隔開的多個表達式。 逗號表達式從左向右依次執行。整個表達式的結果是最后一個表達式的結果。 首先,我們來分析一個代碼: 下面輸出的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.
不難發現,最后起作用的是最后一個表達式的結果。
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 %.1lf\n", s.name, s.age, s.score); //-> struct Stu* ps = &s; printf("%s %d %.1lf\n", (*ps).name, (*ps).age, (*ps).score); printf("%s %d %.1lf\n", ps->name, ps->age, ps->score); return 0; }
這三種情況輸出的結果一樣,感興趣的同學可以自己去試一下!
例如:
#include<stdio.h> int main() { short s = 20; int a = 5; printf("%d\n", sizeof(s = a + 4)); printf("%d\n", s); return 0; }
sizeof輸出的結果是2,這里面int型的a被轉化為short型。
復雜表達式的求值有三個影響的因素:
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 = %d\n" , i );
return 0 ;
}
關于“C語言有哪些操作符”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。