C語言----操作符詳解(萬字詳解)

目錄

1. 操作符的分類

2. 二進制和進制轉換

3. 原碼 反碼 補碼

4. 移位操作符

4.1 左移操作符 >>

4.2 右移操作符 >>

5. 位操作符

5.1 按位與 &

5.2 按位或 |

5.3 按位異或 ^

5.4 按位取反 ~

練習 整數存儲在內存中二進制中1的個數

練習 二進制位置置0或者置1

6.? 單目操作符

7.? 逗號表達式

8. 下標訪問[? ]? ?函數調用( )

8.1 [ ] 下標引用操作符

8.2 () 函數調用操作符

9. 結構成員的訪問操作符

9.1 結構體

9.2 結構體的聲明

9.3?結構體變量的聲明與初始化

9.3.1 聲明結構體變量

9.3.2 初始化結構體變量

9.4?訪問結構體成員

10. 操作符的屬性: 優先級? 結合性

10.1? 優先級

10.2? 結合性

11. 表達式求值

11.1 整型提升

11.2 算數轉換


1. 操作符的分類

類型具體操作符
算術操作符+(加法)、-(減法)、*(乘法)、/(除法)、%(取模 / 取余)
移位操作符<<(左移)、>>(右移)
位操作符&(按位與)、(按位或)、^(按位異或)
賦值操作符=(簡單賦值)、+=(加法賦值)、-=(減法賦值)、*=(乘法賦值)、/=(除法賦值)、%=(取模賦值)、<<=(左移賦值)、>>=(右移賦值)、&=(按位與賦值)、=(按位或賦值)、^=(按位異或賦值)
單目操作符!(邏輯非)、++(自增)、--(自減)、&(取地址)、*(指針取值 / 解引用)、+(正號)、-(負號)、~(按位取反)、sizeof(獲取字節數)、(類型)(類型轉換)
關系操作符>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)、!=(不等于)
邏輯操作符&&(邏輯與)、(邏輯或)
條件操作符? :(三元條件)
逗號表達式操作符,(逗號)
下標引用操作符[ ](方括號)
函數調用操作符( )(圓括號)
結構成員訪問操作符.(結構體變量成員訪問)、->(結構體指針成員訪問)

上面的操作符? 我們在數據類型和變量中以及學過了一部分 今天我們繼續具體介紹我們沒有學過的操作符 但那之前 我們得學習一下二進制 因為有些操作符與二進制有關

2. 二進制和進制轉換

在以前學數學時 我們也聽說過2進制 10進制 那他們是什么意思呢 ?

其實2進制 8進制 10進制 16進制 都是值的不同表現形式 只不過我們平常使用值的時候都默認了10進制方式

15的2進制? ? ? ? 1111

15的8進制? ? ? ? 17

15的10進制? ? ? 15

15的16進制? ? ? ?F

在十進制中的 152??其中2是個位? 5是十位? 1是百位 相當于權重

123相當于3乘以10的0次方+2乘以10的1次方+1乘以10的2次方? 往后依次在次方上按順序+1

而理解了十進制之后 其實其他進制也是相同理解

比如2進制的1101? ?從左到右分別是2的0? 1? 2? 3次方?

那么就相當于1?2的0次方+1?2的1次方+0?2的2次方+1?2的3次方 既1+2+4+8=13

因此二進制的1101實際上就是13? 也就是10進制的13

再舉個8進制的例子 8進制的17是多少呢?

7?8的0次方+1?8的1次方=7+8=15? ? 既15的8進制寫法就是17

而最后我們就來講解以下16進制?

首先我們知道2進制數字是由0 1組成? 8進制是由0~7組成? 10進制由0~9組成? 因為分別滿2 8 10會進一位

而16進制呢? 因為0~9不夠 因此我們使用ABCDEF(小寫也適用)來分別表示10 11 12 13 14 15 這樣就可以表示完了

比如F? 就是F?16的0次方=15?1=15

而2進制如何轉10進制呢? ?剛才已經講過了 權重?權重值即可

10進制如何轉換成2進制呢 如下圖

通過10進制數字 除以2 得到的余數 從下往上寫就是轉換出的2進制

而下面在計算機上試著看看相同數字 不同進制時的值是多少

可以看出來數字都是161? 而10進制的值就是161? 8進制的值是113? 16進制的值是353

而下面我們來說說2進制 轉8進制和16進制的方法

8進制數字是0~7的數字 各自寫成二進制每3個二進制位就足夠了? 比如7的二進制位是111? 所以2進制轉8進制的時候 從2進制序列中 右邊低位開始向左依次 每3個2進制位換算一個8進制位 剩余不夠3個2進制位則直接換算

比如2進制位的01101011 換算成8進制就是0153? 這是8進制表示方法 0開頭的數字

16進制的數字每一位是0~9 a~f的數字 各自寫成2進制 最多有4個2進制位就足夠了 比如f的二進制位是1111 所以2進制轉16進制的 時候 從2進制序列的右邊低位開始向左依次 每4個2進制位換算一個16進制位 剩余不夠4個2進制位則直接換算?

比如2進制的01101011 換成16進制表示就是0x6b? 這是16進制表示方法 0x開頭的數字

同理 8進制位和16進制位 轉2進制只需要反著來1個8進制位轉換成3個2進制位? 1個16進制位轉換成4個2進制位即可

3. 原碼 反碼 補碼

整數的2進制表示方法有三種? 原碼? 反碼? 補碼

有符號的三種表示方法均有符號位和數值位兩部分? 2進制序列中 最高位被當作符號位 剩余的都是數值位?

符號位都是用0表示"正'???用1表示"負' 剩余的都是數值位

而無符號的整數 全部都是數值位

有符號的整數既 signed int? 而無符號的整數既 unsigned int?

而他們的原碼反碼補碼怎么算呢?

原碼: 直接將數值按照正負數的形式翻譯成二進制得到的就是原碼

反碼: 原碼的符號位不變? 其他位依次按位取反就可以得到反碼

補碼:??反碼+1就得到補碼

: 補碼得到原碼也是使用:? 取反? ?+1??的操作

舉例如下:

無符號整型的三種 2進制表示相同? 沒有符號位? 每一位都是數值位

對于整型來說:數據存放在內存中的其實是補碼? 那為什么呢?

  1. 加減統一:減法變加法,硬件只需加法器,省成本。
  2. 零唯一:消滅-0,多存一個數(如-128),不浪費。
  3. 運算快:CPU直接算,無需額外處理符號位。
    本質:用“補數”思想(如鐘表倒撥=正撥)實現高效計算。

4. 移位操作符

<<? 左移操作符? ? ?>>? 右移操作符? ?

注:移位操作符的操作數只能是整數 不能是小數和負數

我將通過具體的例子來解釋

4.1 左移操作符 >>

從圖中 我們就了解到了左移操作符的用法? 并且知道了左移操作符并不會改變操作數的值?

而為什么左移操作符移動一位后 值會變大2唄呢? 那是因為左移一位之后 二進制數都變大了兩倍 因此整體也變大兩倍

同理 移動2位 則變大了四倍 如圖

注: 并不是所有的數左移一位都變大兩倍?

同理 負數也滿足此規則

具體操作過程如下圖

4.2 右移操作符 >>

首先 右移操作符分為兩類?

1 邏輯右移? :? 左邊用0填充,右邊丟棄

2 算術右移? :??左邊用原該值的符號位填充,右邊丟棄

注: 右移具體是什么右移取決于編譯器 而大部分編譯器都是采用 算術右移

驗證:

邏輯右移用0填充 而算數右移中整數是0開頭 也會用0填充 因此我會選擇負數 負數的符號位為1 這樣就可以判斷出來

可以看出來 的確是-5 因此判斷出來是補的原本的數值位 因此我的編譯器采用的是算數右移

快去試試你的編譯器吧

警告: 對于移位操作符來說 不能移動負數位 這個是標準未定義的?

5. 位操作符

位操作符有? ( 雙目操作符 )

&? ? ? ? ? ? // 按位與? ? ? ? ? ? 區別于 && 邏輯與 -- 并且

|? ? ? ? ? ? ?// 按位或? ? ? ? ? ? ?? 區別于 | |?邏輯或 --?或者

^? ? ? ? ? ? // 按位異或? ? ? ? ? ? ? ? ? ? ?

~? ? ? ? ? ? // 按位取反? ? ? ? ? ? ? ? ? ? ? ?

注: 位指的是二進制位

下面我將用具體的例子來講解

5.1 按位與 &

這就是 按位與 &?

特點: 按照對應的二進制進行與運算 只要有0則為0? ?兩個同時為1 才為1

5.2 按位或 |

這就是 按位或 |

特點: |?是按位或 是對應的二進制位或運算 只要有1就是1 兩個為0才是0

5.3 按位異或 ^

這就是 按位異或 ^

特點:異或 ^ 對應的二進制位 相同為0 相異為1 ??

5.4 按位取反 ~

這就是?按位取反 ~

特點:按位取反 ?( 原來是0變成1 原來是1變成0 )

按位異或 ^ 有什么作用呢?

當我們需要交換兩個數的值 但不能創建新變量(第三個變量)時? ^ 就能發揮作用了?

而上述代碼是如何完成交換的呢 這就是 ^ 的作用了

首先我們知道 異或: 相同為0,相異為1

a^a=0? ? 0^a=a

3^3=0? ?3^3^5=5? ?

而3^5^3的值依舊是5? 既 異或是支持交換律的

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main()
{int a = 10;int b = 20;printf("a=%d\n", a);printf("b=%d\n", b);//我們使用a'來作為中間變量理解 代入既可理解 ^a = a ^ b; // a'=a^bb = a ^ b; // b=a'^b=a^b^b=aa = a ^ b; // a=a'^b=a^b^a=bprintf("交換后\n");printf("a=%d\n", a);printf("b=%d\n", b);return 0;
}

而相同為0 是不可能會進位的 這樣也避免的值溢出的問題

練習 整數存儲在內存中二進制中1的個數

思路: 和十進制整數求相似? 12343%10可以得到個位 在/10 可以得到1234 這樣依次既可以計算 同理二進制則%2? /2

輸入15時 得出4? 我們知道15的補碼是00000000000000000000000000001111確實有4位1

但當我們輸入負數時呢

因此以上代碼對負數是不友好的 只能計算二進制正整數中1的個數

因此我們做以下更改

首先我們得知道??

//? 100000000000000000000000000001111? -? ?n

//? 000000000000000000000000000000001? - 1

//? 000000000000000000000000000000001? ?-??n按位與1 既n&1

無論前面的數是什么? 按位與1時 只用管最后一位是不是1 如果是1 那結果也為1? ?不是1那就是0?

可以看出 代碼運行無誤? ?15的進制補碼中有4個1? ? ?-1的補碼中有32個1

其實還有更優解 如下

int count_n(int n)
{int i = 0;int count = 0;while (n){n = n & (n - 1);count++;}return count;
}
int main()
{int n=0 ;while (scanf("%d", &n) == 1){int c = count_n(n);printf("%d\n", c);}return 0;
}

代碼解釋:

例如15的二進制是1111? ? 14是1110

1111&1110=1110? ? ? ?既n=n&(n-1) 繼續往復

1110&1101=1100

1100&1011=1000

1000&0111=0000

一共執行了4次 最后為0 而正好15的二進制數里有4個1 ?因此可以使用while循環和n=n&(n-1)來實現目的

練習 二進制位置置0或者置1

例如把改變13的第5位修改為1 ?然后在修改為0

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main()
{int a = 13;//13=00001101// | 00010000//   00011101//這樣 就能將第五位置為1  而00010000怎么來呢  我們可以使用左移運算符//1左移4位 這樣就能得到00010000a |= (1 << 5-1);printf("a的值為%d", a);return 0;
}

上述操作就可以將第五位修改為1 ?使用到了 按位或 和左移運算符 經此啟發?

我們將第五位修改為0可以通過下面代碼實現

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main()
{int a = 13;//13=00001101// | 00010000  按位與 |//   00011101// & 11101111  按位或 &//   00001101//這樣通過 & 就可以實現第五位轉換為0 //而11101111怎么獲得呢? 可以發現它就是00010000的反碼//既 ~(1<<5-1)a |= (1 << 5-1);printf("a的值為%d\n", a);a &= ~(1 << 5 - 1);printf("a的值為%d\n", a);return 0;
}

可以看出運行結果的確正確 如下:

其中 我們運用到了 按位或 按位取反 左移運算符等

6.? 單目操作符

單目操作符我們已經在數據類型和變量中學過了? 如下

其中 只有 * 和 & 沒有具體講解 這一塊將在之后的指針章節中具體介紹

7. 逗號表達式

首先逗號表達式是什么呢?

逗號表達式就是用逗號隔開的多個表達式

特點: 從左往右依次執行 整個表達式的結果是最后一個表達式的結果

整體結果是expN

下面具體舉例?

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main()
{int a = 13;int b = 14;int c = 15;int d = (a > b, a = b + 10, c, b = a + 1);printf("%d", d);return 0;
}

代碼運行結果是什么呢?? ?如下

結果是25? 因為從左往右計算 a=b+10=24? b=a+1=24+1=25

逗號表達式最后一個式子的值為結果 因此d的值是25

而逗號表達式的優勢在于哪里呢?? 那就是可以精簡代碼??如下代碼

a = get_val();
count_val(a);
while (a >0)
{//處理過程// ~~~~a = get_val();count_val(a);
}

當有如上代碼時 我們可以用逗號表達式來精簡 如下

while (a = get_val(), count_val(a) ,a >0)
{//處理過程// ~~~
}

8. 下標訪問[? ]? ?函數調用( )

8.1 [ ] 下標引用操作符

操作數:一個數組名+一個索引值(下標)

int arr[10];
arr[8]=8;
[ ]的兩個操作數是arr和8

8.2 () 函數調用操作符

int main()
{
printf("hello");// ()是函數調用操作符
int a=add(3,5); // ()是函數調用操作符
// () 的操作數是函數名和參數  至少有一個函數名 可以不要參數
return 0;
}

9. 結構成員的訪問操作符

9.1 結構體

C語言已經提供了內置類型? 如 char short int long double等等? 但是只有這些內置類型還是不夠的? 比如我想描述學生 描述一本書? 這時單一的內置類型是不行的

描述一個學生需要滿足 年齡 學號 身高 體重等

描述一本書需要 滿足? ?作者 出版社 書名 定價等? C語言為了解決這個問題 增加了結構體這種自定義的類型數據? 讓程序員可以自己創造適合的類型

結構是一些值的集合? 這些值被稱為成員變量? 結構的每個成員變量可以是不同類型的變量? 如: 標量? 數組? 指針 甚至是其他結構體?

9.2 結構體的聲明

使用?struct?關鍵字定義結構體,語法如下:

struct 結構體名 {數據類型 成員1;數據類型 成員2;// ...更多成員
};

示例:定義一個表示學生的結構體

struct Student {int id;         // 學號char name[20];  // 姓名float score;    // 成績
};

9.3?結構體變量的聲明與初始化

9.3.1 聲明結構體變量

// 方式1:先定義結構體,再聲明變量
struct Student stu1, stu2;// 方式2:定義結構體時直接聲明變量
struct Student   {int id;char name[20];float score;} stu3, stu4;  // stu3和stu4是全局變量

9.3.2 初始化結構體變量

// 按成員順序初始化
struct Student stu1 = {101, "Alice", 90.5};// 指定成員初始化(C99標準支持)
struct Student stu2 = {.name = "Bob", .score = 85.0f};

通過調試來具體觀察初始化

9.4?訪問結構體成員

使用?.?運算符?訪問成員:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
struct Student {int id;         // 學號char name[20];  // 姓名float score;    // 成績		score	90.5000000	float};
struct Student stu1, stu2;
int main()
{struct Student stu1 = { 101, "Alice", 90.5 };struct Student stu2 = { .name = "Bob", .score = 85.0f };stu1.id = 1001;strcpy(stu1.name, "Tom");  // 字符串需用strcpy賦值stu1.score = 92.5;printf("ID: %d, Name: %s, Score: %.1f\n",  stu1.id, stu1.name, stu1.score);return 0;
}

運行結果如下:

結構體指針與?->?運算符

如何通過指針操作結構體,需用?->?訪問成員? ?稍后在指針章節在講

10. 操作符的屬性: 優先級? 結合性

C語言的操作符有兩個重要的屬性: 優先級和結合性 這兩個屬性決定了表達式求值的計算順序

10.1 優先級

優先級指的是 如果一個表達式包含多個運算符 哪個運算符應該優先執行 各種運算符的優先級是不一樣的

3+4*5; //*優先級更高 因此先算4*5 后算+

10.2 結合性

如果兩個算數符優先級相同 優先級沒有辦法確定先算哪一個時 這時候就看結合性了 根據運算符是左結合 還是右結合 決定執行順序 大部分運算符是左結合(既從左往右計算)? 少數運算符是從右往左計算 比如說賦值運算符( = )

比如 6/3*2? 假如先算3*2那結果就是1? 若先算6/3那結果就是4

因此結合性的作用在無法確定優先性時就會體現出來? 上面的例子就是左結合起了作用

11. 表達式求值

11.1 整型提升

基本概念:

整型提升是指當表達式中使用比int小的整型類型(如charshort等)時,這些值會被自動提升為int類型(如果int能夠表示原類型的所有值)或unsigned int類型(如果不能)。

整型提升的意義:
表達式的整型運算要在CPU的相應運算器件內執行,CPU內整型運算器(ALU)的操作數的字節長度一般就是int的字節長度,同時也是CPU的通用寄存器的長度.
因此,即使兩個char類型的相加,在CPU執行時實際上也要先轉換為CPU內整型操作數的標準長度。
通用CPU(general-purpose CPU)是難以直接實現兩個8比特字節直接相加運算(雖然機器指令中可能有這種字節相加指令)。所以,表達式中各種長度可能小于int長度的整型值,都必須先轉換為int或unsigned int,然后才能送入CPU去執行運算。

總結:

意義說明
提高運算效率CPU 更擅長處理?int?大小的數據,減少額外指令開銷
防止數據溢出提升到?int?后,中間結果不易溢出
統一運算規則避免混合類型運算的歧義,保證可移植性
符合語言標準C/C++ 標準要求整型提升,確保行為一致
簡化編譯器實現減少特殊情況處理,優化代碼生成

整型提升雖然是一個隱式的過程,但它在底層優化、防止錯誤、保證可移植性等方面起著重要作用。理解整型提升有助于編寫更健壯、高效的代碼,并避免一些微妙的類型相關錯誤。

如何進行整型提升呢?

1.有符號整數提升是按照變量的數據類型的符號位來提升的

2.無符號整數提升 高位補0

以下代碼運算結果是多少呢?

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main() {char a = 20;char b = 120;char c = a + b;printf("%d\n", c);return 0;
}

結果如下:

為什么 得出c的值是-116 而不是140呢 原因如下 讓我們利用整型提升的知識來講解

注:char類型占8位? short類型占16位 int類型占32位

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main() {char a = 20;//截斷后存儲到a中//00010100 - a //00000000000000000000000000010100    a整型提升char b = 120;//01111000 - b //00000000000000000000000001111000    b整型提升char c = a + b;// 00010100- a// 00000000000000000000000000010100// 01111000- b// 00000000000000000000000001111000// // 00000000000000000000000000010100// 00000000000000000000000001111000// 00000000000000000000000010001100 - 整型提升后相加// 10001100 - C 通過整型提升得到補碼printf("%d\n", c);//%d-以10進制的形式,打印一個有符號的整型(int)//11111111111111111111111110001100 - 補碼//10000000000000000000000001110011//10000000000000000000000001110100 - 原碼//不難看出值是-116 return 0;
}

11.2 算數轉換

如果某個操作符的各個操作數屬于不同的類型 那么除非其中一個操作數轉換位另一個操作數的類型 否則操作就無法進行 下面的層次體系稱為尋常算數轉換

如下:

100和55.5f是無法進行直接加法運算的 因此需要將100轉換為flort類型?

結語:

以上就是關于操作符的詳細介紹 創作不易 若對您有幫助 請點點關注點點贊? 鄙人不勝感激.?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79425.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79425.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79425.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【進階】C# 委托(Delegate)知識點總結歸納

1. 委托的基本概念 定義&#xff1a;委托是一種類型安全的函數指針&#xff0c;用于封裝方法&#xff08;靜態方法或實例方法&#xff09;。 核心作用&#xff1a;允許將方法作為參數傳遞&#xff0c;實現回調機制和事件處理。 類型安全&#xff1a;委托在編譯時會檢查方法簽…

WebRTC 服務器之Janus視頻會議插件信令交互

1.基礎知識回顧 WebRTC 服務器之Janus概述和環境搭建-CSDN博客 WebRTC 服務器之Janus架構分析-CSDN博客 2.插件使用流程 我們要使?janus的功能時&#xff0c;通常要執?以下操作&#xff1a; 1. 在你的??引入 Janus.js 庫&#xff0c;即是包含janus.js&#xff1b; <…

Go語言中的無鎖數據結構與并發效率優化

1. 引言 在高并發系統開發中&#xff0c;性能瓶頸往往出現在并發控制上。作為一個有著10年Go開發經驗的后端工程師&#xff0c;我見證了無數因鎖競爭導致的性能問題&#xff0c;也親歷了無鎖編程為系統帶來的巨大提升。 傳統的鎖機制就像是十字路口的紅綠燈——雖然能確保安全…

STM32部分:2、環境搭建

飛書文檔https://x509p6c8to.feishu.cn/wiki/DQsBw76bCiWaO4kS8TXcWDs0nAh Keil MDK用于編寫代碼&#xff0c;編譯代碼芯片支持包&#xff0c;用于支持某類芯片編程支持STM32CubeMX用于自動生成工程&#xff0c;減少手動重復工作 STM32F1系列芯片支持包 軟件下載 直接下載&am…

U3D工程師簡歷模板

模板信息 簡歷范文名稱&#xff1a;U3D工程師簡歷模板&#xff0c;所屬行業&#xff1a;其他 | 職位&#xff0c;模板編號&#xff1a;B29EPQ 專業的個人簡歷模板&#xff0c;邏輯清晰&#xff0c;排版簡潔美觀&#xff0c;讓你的個人簡歷顯得更專業&#xff0c;找到好工作。…

Java設計模式: 實戰案例解析

Java設計模式: 實戰案例解析 在軟件開發中&#xff0c;設計模式是一種用來解決特定問題的可復用解決方案。它們是經過實踐驗證的最佳實踐&#xff0c;能夠幫助開發人員設計出高質量、易于維護的代碼。本文將介紹一些常見的Java設計模式&#xff0c;并通過實戰案例解析它們在實際…

Vue3源碼學習5-不使用 `const enum` 的原因

文章目錄 前言? 什么是 const enum? 為什么 Vue 3 不使用 const enum1. &#x1f4e6; **影響構建工具兼容性**2. &#x1f501; **難以做模塊間 tree-shaking**3. &#x1f9ea; **調試困難**4. &#x1f4e6; **Vue 是庫&#xff0c;不掌控用戶配置** ? 官方推薦做法&…

C++學習:六個月從基礎到就業——C++11/14:lambda表達式

C學習&#xff1a;六個月從基礎到就業——C11/14&#xff1a;lambda表達式 本文是我C學習之旅系列的第四十篇技術文章&#xff0c;也是第三階段"現代C特性"的第二篇&#xff0c;主要介紹C11/14中引入的lambda表達式。查看完整系列目錄了解更多內容。 引言 Lambda表達…

AIDC智算中心建設:計算力核心技術解析

目錄 一、智算中心發展概覽 二、計算力核心技術解析 一、智算中心發展概覽 智算中心是人工智能發展的關鍵基礎設施&#xff0c;基于人工智能計算架構&#xff0c;提供人工智能應用所需算力服務、數據服務和算法服務的算力基礎設施&#xff0c;融合高性能計算設備、高速網絡以…

IoTDB時序數據庫V2.0.2大版本更新的一些梳理

一些小知識&#xff1a; 關于事務&#xff1a;時序數據庫是沒有事務的&#xff0c;它和關系數據庫的應用場景不同&#xff0c;通常情況下不需要多點同時操作同一條數據&#xff0c;而且要保證極高的吐出量&#xff0c;事務太消耗資源&#xff0c;并且時序數據庫提供了覆寫的功能…

CSS定位詳解

在前端開發中&#xff0c;CSS 定位&#xff08;positioning&#xff09;是一個核心概念&#xff0c;它決定了元素在頁面上的位置和布局方式。無論是構建復雜的交互界面&#xff0c;還是實現簡單的頁面排版&#xff0c;CSS 定位都是不可或缺的工具。本文將全面介紹 CSS 中的五種…

React 語法擴展

useReducer鉤子函數 不同action類型返回不同處理行為 useState()函數返回解構為兩個值 state當前狀態 dispatch修改狀態函數 dispatch()函數參數為一個actuon對象 如 &#xff1a; 樣例&#xff1a; import { useReducer } from react; import ./App.css;// 定義一個Reduce…

MCP協議與Dify集成教程

一、MCP協議概述 MCP&#xff08;Model Control Protocol&#xff09;是一種新興的開放協議&#xff0c;為大型語言模型&#xff08;LLM&#xff09;與外部應用之間構建了雙向通信通道。它就像是AI的"USB-C"接口&#xff0c;幫助模型發現、理解并安全調用各種外部工…

學習springboot-條件化配置@Conditional(條件注解)

前言 在Spring Boot中&#xff0c;Conditional 注解及其相關注解是用于條件化配置的重要工具。它們允許開發者根據特定條件決定是否加載某個Bean或配置類。 注意&#xff1a;Conditional 相關注解&#xff0c;通常和Bean搭配使用 學習springboot-Bean管理&#xff08;Bean 注…

2025年- H18-Lc126-54.螺旋矩陣(矩陣)---java版

1.題目描述 2.思路* 思路1&#xff1a; 補充2&#xff1a; directions[1][0] // 表示“下”這個方向的行增量&#xff08;1&#xff09; directions[1][1] // 表示“下”這個方向的列增量&#xff08;0&#xff09; int[][] directions {{0, 1}, {1, 0}, {0, -1}, {-…

微信小程序連續多個特殊字符自動換行解決方法

效果圖 .wxml <view class"container"><text>沒轉換{{text}}</text><view style"height: 60rpx;" /><text>轉換后{{convert}}</text> </view>.js Page({data: {text:&#xff01;&#xff01;&#xff01;&am…

編程速遞-RAD Studio 12.3 Athens四月補丁:關注軟件性能的開發者,安裝此補丁十分必要

2025年4月22日&#xff0c;Embarcadero發布了針對RAD Studio 12.3、Delphi 12.3以及CBuilder 12.3的四月補丁。此更新旨在提升這些產品的質量&#xff0c;特別關注于Delphi編譯器、C 64位現代工具鏈、RAD Studio 64位IDE及其調試器、VCL庫和其他RAD Studio特性。強烈建議所有使…

Linux 進程基礎(二):操作系統

目錄 一、什么是操作系統&#xff1a;用戶和電腦之間的「翻譯官」&#x1f310; OS 的層狀結構&#x1f9e9; 案例解析&#xff1a;雙擊鼠標的「跨層之旅」 二、操作系統的必要性探究&#xff1a;缺乏操作系統的環境面臨的挑戰剖析&#x1f511; OS 的「管理者」屬性&#xff1…

第 11 屆藍橋杯 C++ 青少組中 / 高級組省賽 2020 年真題,選擇題詳細解釋

一、選擇題 第 2 題 在二維數組按行優先存儲的情況下&#xff0c;元素 a[i][j] 前的元素個數計算如下&#xff1a; 1. **前面的完整行**&#xff1a;共有 i 行&#xff0c;每行 n 個元素&#xff0c;總計 i * n 個元素。 2. **當前行的前面元素**&#xff1a;在行內&#x…

1??7??three.js_OrbitControls相機控制器

17、相機軌道控制器 3D虛擬工廠在線體驗相機軌道控制器OrbitControls 它是 Three.js 中最常用的交互控制器之一,專門用于通過鼠標/觸摸控制相機圍繞一個目標點(target)旋轉、縮放和平移。import {OrbitControls } from three/addons/controls/OrbitControls.js; const cont…