內容導讀
- 1.C語言運算子
- 1.1運算子概述
- 1.2運算子分類
- 1.3運算子優先級
- 2.C語言運算子超全總結
- 2.1算數運算子
- 2.2關系運算子
- 2.3邏輯運算子
- 2.4位運算子
- 2.5賦值運算子
- 2.6條件運算子
- 2.7逗號運算子
- 2.8指標運算子
- 2.9求位元組運算子
- 2.10強制型別轉換運算子
- 2.11成員運算子
- 2.12下標運算子
- 2.13其他運算子
- 3.C語言中的運算式
- 3.1關系,邏輯,條件運算式
- 3.2隱式型別轉換和算術轉換
- 3.2.1隱式型別轉換
- 3.2.2算術轉換
前面的話:
作者水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!
博主的碼云gitee,平常博主寫的程式代碼都在里面,
1.C語言運算子
1.1運算子概述
C語言
運算子是說明特定操作的符號 ,所以它也被稱作為運算子,它是構造C語言運算式的工具 ,C語言的運算例外豐富,除了控制陳述句和輸入輸出以外的幾乎所有的基本操作都為運算子處理,除了常見的三大類,算術運算子、關系運算子與邏輯運算子之外,還有一些用于完成特殊任務的運算子,比如位運算子,
1.2運算子分類

1.3運算子優先級
優先級一共可以劃分為15級,1級優先級最高,15級優先級最低,

同一優先級的運算子,運算次序由結合方向所決定,
2.C語言運算子超全總結
2.1算數運算子
+:加法
-:減法
*:乘法
/:除法
%:取模(求余數)
++:自增運算,i++和++i都相當于i=i+1,但是i++先使用再++,++i是先++再使用,
--:自減運算,用法和++相同,
- 除了 % 運算子之外,其他的幾個運算子可以作用于整數和浮點數,
- 對于 / 運算子如果兩個運算元都為整數,執行整數除法,而只要有浮點數執行的就是浮點數除法,
- % 運算子的兩個運算元必須為整數,回傳的是整除之后的余數,
OJ例題1:
💡BC17 計算運算式的值
描述
請計算運算式“(-8+22)×a-10+c÷2”,其中,a = 40,c = 212,
輸入描述:
無,
輸出描述:
(-8+22)×a-10+c÷2計算之后的結果,為一個整數,
#include <stdio.h>
int main(){
int a = 40,c = 212,b = 0;
b=(-8+22)*a-10+c/2;
printf("%d",b);
return 0;
}
OJ例題2:
💡BC18 計算帶余除法
描述
給定兩個整數a和b (-10,000 < a,b < 10,000),計算a除以b的整數商和余數,
輸入描述:
一行,包括兩個整數a和b,依次為被除數和除數(不為零),中間用空格隔開,
輸出描述:
一行,包含兩個整數,依次為整數商和余數,中間用一個空格隔開,
輸入:
15 2
輸出:
7 1
#include <stdio.h>
int main(){
int a=0,b=0,c=0,d=0;
scanf("%d %d",&a,&b);
c=a/b;
d=a%b;
printf("%d %d",c,d);
return 0;
}
OJ例題3:
💡BC27 計算球體的體積
描述
給定一個球體的半徑,計算其體積,其中球體體積公式為 V = 4/3*πr3,其中 π= 3.1415926,
輸入描述:
一行,用浮點數表示的球體的半徑,
輸出描述:
一行,球體的體積,小數點后保留3位,
輸入:
3.0
輸出:
113.097
#include <stdio.h>
int main(){
double V=0,r=0,pi=3.1415926;
scanf("%lf",&r);
V=4.0/3*pi*pow(r,3);
printf("%.3lf",V);
return 0;
}
OJ例題4:
💡BC129 小樂樂計算函式

輸入:
1 2 3
輸出:
0.30
#include <stdio.h>
int max_3(int a, int b, int c)
{
int max = 0;
if (a > max)
max = a;
if (b > max)
max = b;
if (c > max)
max = c;
return max;
}
int main()
{
int a = 0;
int b = 0;
int c = 0;
double m = 0;
scanf("%d%d%d",&a,&b,&c);
int m1 = max_3(a + b, b, c);
int m2 = max_3(a, b + c, c);
int m3 = max_3(a, b, b + c);
m = 1.0*m1 / (m2 + m3);
printf("%.2lf\n",m);
return 0;
}
2.2關系運算子
>:大于
<:小于
== :等于
>= :大于等于
<= :小于等于
!=:不等于
這些運算子用來構成關系運算式,用來做if分支陳述句或者回圈陳述句的運算式,
OJ例題:
💡BC49 判斷兩個數的大小關系
描述
KiKi想知道從鍵盤輸入的兩個數的大小關系,請編程實作,
輸入描述:
題目有多組輸入資料,每一行輸入兩個整數(范圍(1 ~231-1),用空格分隔,
輸出描述:
針對每行輸入,輸出兩個整數及其大小關系,數字和關系運算子之間沒有空格,詳見輸入輸出樣例,

#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
while(scanf("%d %d",&a,&b) != EOF)
{
if (a == b)
{
printf("%d=%d\n",a,b);
}
else if (a > b)
{
printf("%d>%d\n",a,b);
}
else
{
printf("%d<%d\n",a,b);
}
}
return 0;
}
2.3邏輯運算子
!:邏輯非,
&&:邏輯與,兩個條件都為真運算式才為真,
||:邏輯或,兩個條件都為假運算式才為假,
用于構成邏輯運算式,在分支陳述句和回圈陳述句用的多,
OJ例題:
💡BC51 三角形判斷
描述
KiKi想知道已經給出的三條邊a,b,c能否構成三角形,如果能構成三角形,判斷三角形的型別(等邊三角形、等腰三角形或普通三角形),
輸入描述:
題目有多組輸入資料,每一行輸入三個a,b,c(0<a,b,c<1000),作為三角形的三個邊,用空格分隔,
輸出描述:
針對每組輸入資料,輸出占一行,如果能構成三角形,等邊三角形則輸出“Equilateral triangle!”,等腰三角形則輸出“Isosceles triangle!”,其余的三角形則輸出“Ordinary triangle!”,反之輸出“Not a triangle!”,
提示:所有的三角形都要滿足兩邊之和大于第三邊,
輸入:
2 3 2
3 3 3
輸出:
Isosceles triangle!
Equilateral triangle!
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
while(scanf("%d %d %d",&a,&b,&c) != EOF)
{
if ((a + b >c) && (b + c > a) && (a + c > b))
{
if ((a == b) && (b == c))
printf("Equilateral triangle!\n");
else if ((a == b ) || (a == c) || (b == c))
printf("Isosceles triangle!\n");
else
printf("Ordinary triangle!\n");
}
else
{
printf("Not a triangle!\n");
}
}
return 0;
}
2.4位運算子
<<:左移
整數在計算機中儲存的是他的二進制補碼,<<能夠將它的二進制序列左移,末位使用0補齊,
運算元 << 移動位數
比如數字2,補碼為
0000 0000 0000 0000 0000 0000 0000 0010
2<<1運算后,得
0000 0000 0000 0000 0000 0000 0000 0100
為數字4,
>>:右移
整數在計算機中儲存的是他的二進制補碼,>>能夠將它的二進制序列右移,如果為算術右移則負數首位補1,正數首位補0,如果為邏輯右移,首位通通補0,至于是算術右移還是邏輯右移,不同編譯器不同,VS2019為算術右移,
運算元 >> 移動位數
比如-1,原碼為
1000 0000 0000 0000 0000 0000 0000 0001
取反,得
1111 1111 1111 1111 1111 1111 1111 1110
加1,得補碼
1111 1111 1111 1111 1111 1111 1111 1111
-1>>1運算后得
算術右移
1111 1111 1111 1111 1111 1111 1111 1111
邏輯右移
0111 1111 1111 1111 1111 1111 1111 1111
按VS2019算術右移轉化為原碼得
1000 0000 0000 0000 0000 0000 0000 0001
為數字-1,
~:按位取反,將一個數二進制序列每位都取反,
~運算元
比如數字3,補碼為
0000 0000 0000 0000 0000 0000 0000 0011
~3運算后得
1111 1111 1111 1111 1111 1111 1111 1100
為一個負數,先將補碼還原成原碼
減1,得
1111 1111 1111 1111 1111 1111 1111 1011
除最高位取反
1000 0000 0000 0000 0000 0000 0000 0100
為數字-4,
|:按位或,對兩個數的二進制序列每位比較都為0則為0,否則為1,
運算元 | 運算元
比如2 | 3
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0011
結果為
0000 0000 0000 0000 0000 0000 0000 0011
為數字3,
^:按位異或,對兩個數的二進制序列每位比較不相同為1,否則為0,
運算元 ^ 運算元
比如2 ^ 3
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0011
結果為
0000 0000 0000 0000 0000 0000 0000 0001
為數字1,
&:按位與,對兩個數的二進制序列每位比較都為1則為1,否則為0,
運算元 & 運算元
比如2 & 3
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0011
結果為
0000 0000 0000 0000 0000 0000 0000 0010
為數字2,
上面幾種運算子的操作物件必須為整數,
#include <stdio.h>
int main()
{
printf("%d\n", 2 << 1); //4,2左移1位
printf("%d\n", -1 >> 1);//-1,-1算術右移一位
printf("%d\n", ~ 3);//-4,對3按位取反
printf("%d\n", 2 | 3);//3,2|3
printf("%d\n", 2 ^ 3);//1,2^3
printf("%d\n", 2 & 3);//2,2&3
return 0;
}

OJ例題:
💡BC29 2的n次方計算
描述
不使用累計乘法的基礎上,通過移位運算(<<)實作2的n次方的計算,
輸入描述:
多組輸入,每一行輸入整數n(0 <= n < 31),
輸出描述:
針對每組輸入輸出對應的2的n次方的結果,
輸入:
2
10
輸出:
4
1024
#include <stdio.h>
int main(){
int a=0;
while(scanf("%d",&a) != EOF){
printf("%d\n",1<<a);
}
return 0;
}
2.5賦值運算子
=:賦值,比如a = 2,a = c
復合賦值運算子:+= -= /= *= %= <<= >>= |= &= ^=…
a += 2相當于a = a + 2,其他的以此類推,
OJ例題:
💡BC20 kiki算數
描述
問題:KiKi今年5歲了,已經能夠認識100以內的非負整數,并且并且能夠進行 100 以內的非負整數的加法計算,不過,BoBo老師發現KiKi在進行大于等于100的正整數的計算時,規則如下:
- 只保留該數的最后兩位,例如:對KiKi來說1234等價于34;
- 如果計算結果大于等于 100, 那么KIKI也僅保留計算結果的最后兩位,如果此兩位中十位為0,則只保留個位,
例如:45+80 = 25
要求給定非負整數 a和 b,模擬KiKi的運算規則計算出 a+b 的值,輸入描述:
一行,輸入兩個非負整數a和b,用一個空格分隔,(0 <= a,b<= 231-1),
輸出描述:
針對每組輸入,輸出按照KiKi的運算規則計算出 a+b 的值,
輸入:
45 80
輸出:
25
#include <stdio.h>
int main(){
int a=0,b=0,sum=0;
scanf("%d %d",&a,&b);
a%=100;
b%=100;
sum=a+b;
if(sum>=100)
sum%=100;
printf("%d",sum);
return 0;
}
2.6條件運算子
? ::條件運算子,也被稱為三目運算子,C語言中唯一一個三目運算子,
if (a > b)
return a;
else
return b;
//相當于
a > b ? a : b;
2.7逗號運算子
,:逗號運算子,就是用逗號隔開的多個運算式,從左向右依次執行,整個運算式的結果是最后一個運算式的結果,
int main()
{
int a = 3;
int b = 2;
int c = 6;
int d = (a + b, b + c, a + c);//從左至右依次進行,d的值為最后一個運算式結果,也就是9
return 0;
}
2.8指標運算子
*:解參考運算子,用于訪問一個指標所指向空間內的資料,
&:取地址運算子,用于得到一個資料或資料型別的地址,
#include <stdio.h>
int main()
{
int a = 68;
int* pa = &a;
printf("%p\n", pa);
printf("%d\n", *pa);
printf("%d\n", a);
return 0;
}

2.9求位元組運算子
sizeof:用來計算一個資料或資料型別所占位元組大小,
#include <stdio.h>
int main()
{
int a = 9;
double pi = 3.14;
char c = "w";
float b = 2.3f;
int* pa = &a;
char* pc = &c;
double* ppi = π
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(pi));
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(c));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(b));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(double*));
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(ppi));
printf("%d\n", sizeof(pc));
return 0;
}

2.10強制型別轉換運算子
(資料型別):將一個資料強制轉換成想要的資料型別,
比如
int a = 6;
double b = 3.14;
int c = (int) b;
double d = (double) a;
a = (double) a;//6.000000
b = (int) b;//3
2.11成員運算子
.:訪問結構體成員,結構體.成員名
->:訪問結構體成員,結構體指標 -> 成員名
#include <stdio.h>
struct Book
{
char book_name[40];
int book_price;
char book_id[20];
};
int main()
{
struct Book C = { "C語言運算子詳解" ,49, "9635419049866812" };
printf("%s\n", C.book_name);
printf("%s\n", (&C)->book_name);
printf("%d\n", C.book_price);
printf("%d\n", (&C)->book_price);
printf("%s\n", C.book_id);
printf("%s\n", (&C)->book_id);
return 0;
}

2.12下標運算子
[ ]:作為陣列下標,可以用來訪問陣列元素,
#include <stdio.h>
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);//[]作為下標,訪問陣列元素
}
return 0;
}

2.13其他運算子
如函式呼叫符( ),
printf("%...", ...);
scanf("%...", &...);
//等等
3.C語言中的運算式
3.1關系,邏輯,條件運算式
具體內容見博主另一篇文章:C語言的選擇與輪回——選擇結構與回圈結構的1.3運算式部分,
3.2隱式型別轉換和算術轉換
3.2.1隱式型別轉換
C的整型算術運算總是至少以預設整型型別的精度來進行的,
為了獲得這個精度,運算式中的字符和短整型運算元在使用之前被轉換為普通整型,這種轉換稱為整型提升,
整型提升的意義:
運算式的整型運算要在CPU的相應運算器件內執行,CPU內整型運算器(ALU)的運算元的位元組長度一般就是int的位元組長度,同時也是CPU的通用暫存器的長度,
因此,即使兩個char型別的相加,在CPU執行時實際上也要先轉換為CPU內整型運算元的標準長度,通用CPU(general-purpose CPU)是難以直接實作兩個8位元位元組直接相加運算(雖然機器指令中可能有這種位元組相加指令),所以,運算式中各種長度可能小于int長度的整型值,都必須先轉 換為int或unsigned int,然后才能送入CPU去執行運算,
整形提升是按照變數的資料型別的符號位來提升的
//負數的整形提升
char c1 = -1;
變數c1的二進制位(補碼)中只有8個位元位:
1111111
因為 char 為有符號的 char
所以整形提升的時候,高位補充符號位,即為1
提升之后的結果是:
11111111111111111111111111111111
//正數的整形提升
char c2 = 1;
變數c2的二進制位(補碼)中只有8個位元位:
00000001
因為 char 為有符號的 char
所以整形提升的時候,高位補充符號位,即為0
提升之后的結果是:
00000000000000000000000000000001
//無符號整形提升,高位補0
3.2.2算術轉換
如果某個運算子的各個運算元屬于不同的型別,那么除非其中一個運算元的轉換為另一個運算元的型別,否則操作就無法進行,下面的層次體系稱為尋常算術轉換,也稱自動型別轉換,
如果一個運算子兩側的資料型別不同,則先自動進行型別轉換,使二者成為同一種型別,然后進行運算,整型、實型、字符型資料間可以進行混合運算,規律為:
💡+、-、*、/運算的兩個數中有一個數為float或double型,結果是double型,因為系統將所有float型資料都先轉換為double型,然后進行運算,
💡如果int型與float或double型資料進行運算,先把int型和float型資料轉換為double型,然后進行運算,結果是double型,
💡字符(char)型資料與整型資料進行運算,就是把字符的ASCII代碼與整型資料進行運算,如果字符型資料與實型資料進行運算,則將字符的ASCII代碼轉換為double型資料,然后進行運算 ,
如果賦值運算子兩側的型別一致,則直接進行賦值,
如果賦值運算子兩側的型別不一致,但都是基本型別時,在賦值時要進行型別轉換,型別轉換是由系統自動進行的,轉換的規則是:
💡將浮點型資料(包括單、雙精度)賦給整型變數時,先對浮點數取整,即舍棄小數部分,然后賦予整型變數,存在精度丟失,
💡將整型資料賦給單、雙精度變數時,數值不變,但以浮點數形式存盤到變數中,
💡將一個double型資料賦給float變數時,先將雙精度數轉換為單精度,即只取6~7位有效數字,存盤到float型變數的4個位元組中,應注意雙精度數值的大小不能超出float型變數的數值范圍;將一個float型資料賦給double型變數時,數值不變,在記憶體中以8個位元組存盤,有效位數擴展到15位,
💡字符型資料賦給整型變數時,將字符的ASCII代碼賦給整型變數,
💡將一個占位元組多的整型資料賦給一個占位元組少的整型變數或字符變數時,只將其低位元組原封不動地送到被賦值的變數(即發生“截斷”),
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292087.html
標籤:其他
