C語言各種操作符透徹理解下篇
1.單目操作符
之前有了解到的三目操作符(?:),指的是有三個(gè)操作數(shù)
例如:3+5
其中,+是一個(gè)操作符
3是左操作數(shù)
5是有操作數(shù)
+則是一個(gè)雙目操作符
那么什么是單目操作符呢,也就是只有一個(gè)操作數(shù)的
我們常見的操作符有:
這里我們來詳細(xì)介紹一下sizeof、~、++與--
1.sizeof
sizeof常用來計(jì)算類型的長(zhǎng)度,比如數(shù)組類型,int、char、short等等。同時(shí),sizeof是操作符,不是函數(shù),所以后面的括號(hào)可以省略。但算類型長(zhǎng)度的時(shí)候不能省,這是語法要求。
下面就是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]));//計(jì)算整個(gè)數(shù)組的長(zhǎng)度 printf("%d\n", sizeof a); //printf("%d\n", sizeof int);這樣寫是會(huì)報(bào)錯(cuò)的 return 0; }
計(jì)算出的結(jié)果如下:
2.~
~的主要作用就是對(duì)一個(gè)數(shù)的二進(jìn)制按位取反,但同樣的,最后打印出來的是原碼
#include<stdio.h> int main() { int a = 0; //~按(內(nèi)存中補(bǔ)碼的2進(jìn)制)位取反 //00000000000000000000000000000000 //11111111111111111111111111111111 - 補(bǔ)碼 //11111111111111111111111111111110 - 反碼 //10000000000000000000000000000001 - 原碼 --> -1 printf("%d\n", ~a); return 0; }
運(yùn)行結(jié)果如下:
這里有個(gè)~的應(yīng)用:
怎樣將一個(gè)數(shù)進(jìn)行復(fù)原
#include<stdio.h> int main() { int a = 10; a |= (1 << 2); printf("%d\n", a); a &= ~(1 << 2); printf("%d\n", a); return 0; //如果只想把倒數(shù)第三個(gè)數(shù),也就是0改為1,可以進(jìn)行以下操作 //00000000000000000000000000001010 //00000000000000000000000000000100 1<<2(用a與1<<2異或來實(shí)現(xiàn)) //00000000000000000000000000001110 //11111111111111111111111111111011 ~(1<<2)(要想將a復(fù)原,就是再將倒數(shù)第三個(gè)數(shù)變?yōu)?) //00000000000000000000000000001010 }
3.++與--
這里主要注意的是分前置與后置
前置++/--:先加/減再使用
后置++/--:先使用再加/減
a每加一次就會(huì)記錄,總共加了兩次,所以是3。
對(duì)于b,先使用了a的值再對(duì)a進(jìn)行++,所以是1.
到c這里,a實(shí)際上已經(jīng)變成2了,而c是先對(duì)a進(jìn)行加1再用它的值,所以c為3。
4.*(解引用操作符)
#include<stdio.h> int main() { int a = 10; int* pa = &a; *pa = 20;//通過*來訪問a的地址 printf("%d\n", a); printf("%d\n", *pa);//此時(shí)的*pa就是a的值 int* px = &*pa;//px通過*來訪問*pa,也就是訪問a *px = 30; printf("%d\n", a); return 0; }
2.關(guān)系操作符
3.邏輯操作符
(只關(guān)注變量的真假)
來看一道360的筆試題,判斷一下程序輸出的結(jié)果是多少。
我們先來看下第一種,a是先使用再進(jìn)行++,這里a是0,是0則為假,那么后面的就都不要看了,還是原來的結(jié)果,但a進(jìn)行了++
再看第二種,先打個(gè)比方,我想讓張三或者李四,一個(gè)來我辦公室,張三來了,那李四來不來就已經(jīng)無所謂了,這里也是一樣,a先使用再++,則a=0,表示沒有人來,沒人來就繼續(xù)進(jìn)行,b是先++再使用,b=3,為真,就是有人來了,有人來了以后,后面的來不來都無所謂,所以d就不再進(jìn)行,最后輸出的結(jié)果就是1334.
(做個(gè)小總結(jié):&&---左操作數(shù)為假,右邊不計(jì)算 ||---左操作數(shù)為真,右邊不計(jì)算)
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);//與上面那段代碼等價(jià) return 0; }
5.逗號(hào)表達(dá)式
逗號(hào)表達(dá)式,就是用逗號(hào)隔開的多個(gè)表達(dá)式。 逗號(hào)表達(dá)式從左向右依次執(zhí)行。整個(gè)表達(dá)式的結(jié)果是最后一個(gè)表達(dá)式的結(jié)果。 首先,我們來分析一個(gè)代碼: 下面輸出的c是多少?
int a = 1; int b = 2; int c = (a > b, a = b + 10, a, b = a + 1);
我們來看括號(hào)里面的式子,像a>b、a這樣子的對(duì)a和b毫不起作用,可以直接忽略掉,然后a=b+10,這里a變成了12,最后b=a+1=13.所以結(jié)果是13.
不難發(fā)現(xiàn),最后起作用的是最后一個(gè)表達(dá)式的結(jié)果。
6.下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
1. [ ] 下標(biāo)引用操作符
操作數(shù):一個(gè)數(shù)組名+一個(gè)索引值
2.( )函數(shù)調(diào)用操作符
接受一個(gè)或者多個(gè)操作數(shù):第一個(gè)操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù)。
#include<stdio.h> void menu() { printf("*************************\n"); printf("****** hello ******\n"); printf("****** friends ******\n"); printf("*************************\n"); } int main() { menu(); return 0; }
3.訪問一個(gè)結(jié)構(gòu)的成員
. 結(jié)構(gòu)體.成員名
-> 結(jié)構(gòu)體指針->成員名
#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; }
這三種情況輸出的結(jié)果一樣,感興趣的同學(xué)可以自己去試一下!
7.隱式類型轉(zhuǎn)換
例如:
#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輸出的結(jié)果是2,這里面int型的a被轉(zhuǎn)化為short型。
8.操作符的屬性
復(fù)雜表達(dá)式的求值有三個(gè)影響的因素:
1.操作符的優(yōu)先級(jí)
2.操作符的結(jié)合性
3.是否控制求值順序
兩個(gè)相鄰的操作符先執(zhí)行哪個(gè),取決于他們的優(yōu)先級(jí)。如果兩者的優(yōu)先級(jí)相同,取決于他們的結(jié)合性。
// 表達(dá)式的求值部分由操作符的優(yōu)先級(jí)決定。
// 表達(dá)式 1
a * b + c * d + e * f
在計(jì)算的時(shí)候,由于*比+的優(yōu)先級(jí)高,只能保證,*的計(jì)算是比+早,但是優(yōu)先級(jí)并不
能決定第三個(gè) * 比第一個(gè) + 早執(zhí)行。
// 表達(dá)式2
c + -- c ;
同上,操作符的優(yōu)先級(jí)只能決定自減-- 的運(yùn)算在 + 的運(yùn)算的前面,但是我們并沒有辦法得 知,+操作符的左操作數(shù)的獲取在右操作數(shù)之前還是之后求值,所以結(jié)果是不可預(yù)測(cè)的,是有歧義 的。
// 代碼 3- 非法表達(dá)式 int main () { int i = 10 ; i = i -- - -- i * ( i = - 3 ) * i ++ + ++ i ; printf ( "i = %d\n" , i ); return 0 ; }
我們?cè)趯懘a的時(shí)候,難免會(huì)為一些小細(xì)節(jié)而頭痛,只有在我們熟練掌握這些知識(shí)的時(shí)候才能避免這些尷尬的小問題,希望操作符詳解能對(duì)你有些幫助!
到此這篇關(guān)于C語言各種操作符透徹理解下篇的文章就介紹到這了,更多相關(guān)C語言 操作符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃過程詳解
動(dòng)態(tài)規(guī)劃是解決一類最優(yōu)問題的常用方法,它是解決最優(yōu)化問題的一種途徑,在本文中,我們將討論如何使用C++實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃算法,并提供一些示例來幫助您更好地理解該算法2023-05-05C語言實(shí)例實(shí)現(xiàn)二叉搜索樹詳解
二叉搜索樹是以一棵二叉樹來組織的。每個(gè)節(jié)點(diǎn)是一個(gè)對(duì)象,包含的屬性有l(wèi)eft,right,p和key,其中,left指向該節(jié)點(diǎn)的左孩子,right指向該節(jié)點(diǎn)的右孩子,p指向該節(jié)點(diǎn)的父節(jié)點(diǎn),key是它的值2022-05-05stringstream操縱string的方法總結(jié)
下面小編就為大家?guī)硪黄猻tringstream操縱string的方法總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12c語言通過opencv實(shí)現(xiàn)輪廓處理與切割
這篇文章主要介紹了c語言通過opencv實(shí)現(xiàn)輪廓處理與切割,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01MySQL的內(nèi)存表的基礎(chǔ)學(xué)習(xí)教程
這篇文章主要介紹了MySQL的內(nèi)存表的基礎(chǔ)學(xué)習(xí)教程,包括內(nèi)存表的創(chuàng)建以及使用限制等等,需要的朋友可以參考下2015-12-12