目錄
注釋符號
其他注釋方法
注釋建議
接續(xù)符和轉(zhuǎn)義符
在續(xù)行符\之前或者之后帶上空格,行不行?
\n:換行符與\r:回車符之間的區(qū)別
兩個小程序(旋轉(zhuǎn)光標、倒計時)
單引號和雙引號
?'abcd'這樣寫有問題嗎?
特殊情況
為何計算機需要字符
邏輯運算符
短路
位運算符
&& vs &、|| vs |的區(qū)別
關于^的理解
通過異或交換兩個整數(shù)
注釋符號
????????在C語言中,注釋指的是在程序代碼中添加的一些說明或標記,這些注釋并不會被編譯器解析和執(zhí)行,僅僅是為了幫助程序員更好地理解代碼。
C語言中支持兩種注釋方式:
1. 單行注釋:使用“//”符號標記注釋內(nèi)容,從“//”開始到該行結(jié)尾處都被視為注釋,編譯器會忽略這些內(nèi)容。
例如:
2. 多行注釋:使用“/*”和“*/”符號包含多行注釋內(nèi)容,從“/*”開始到“*/”結(jié)束的所有內(nèi)容都被視為注釋,編譯器會忽略這些內(nèi)容。
例如:
注釋是一種很重要的編程技巧,它可以增強代碼的可讀性和可維護性,方便其他人或自己在之后修改代碼。
#include<stdio.h>
int main()
{
int /* */ i; //正確
char* s = "abcd //xyz"; //正確
//Is it a\
valid comment? //正確
in/* */t j; //報錯
return 0;
}
注意:注釋被替換,本質(zhì)是替換成空格。
# 和 define之間是可以帶空格的。
1.c語言風格注釋無法嵌套
2./*總是與離它最近的*/匹配
其他注釋方法
//基于條件編譯,代碼編譯期間處理
#include <stdio.h>
#define MONEY 0
int main()
{
#if MONEY
printf("for test1\n"); //test1
printf("for test2\n"); //test2
#endif
return 0;
}
//基于if判斷,代碼運行期間處理
#include <stdio.h>
int main()
{
//if (0)注釋方法
if (0) {
printf("for test1\n"); //test1
printf("for test2\n"); //test2
}
return 0;
}
注釋建議
????????復雜的函數(shù)中,在分支語句、循環(huán)語句結(jié)束之后需要適當?shù)淖⑨專奖銋^(qū)分各分支或循環(huán)體。
接續(xù)符和轉(zhuǎn)義符
????????在C語言中,續(xù)行符和轉(zhuǎn)義符都是用來對特殊字符進行處理和表示的。它們的作用與用途是不同的,下面我來簡單解釋一下:
1. 續(xù)行符
續(xù)行符是用來將一行過長的代碼分割成多行的特殊字符,以便于閱讀和編寫。在C語言中,續(xù)行符使用反斜線符號“\”來表示,用在需要跨行的地方的末尾處。
例如:
?使用續(xù)行符后,上面的代碼可以分為三行來編寫,其結(jié)果和不使用續(xù)行符的代碼是一樣的。
2. 轉(zhuǎn)義符
轉(zhuǎn)義符是用來表示一些特殊字符的符號。在C語言中,轉(zhuǎn)義符使用反斜線符號“\”配合后面的字符來表示,常用的轉(zhuǎn)義符有:
- \n:表示換行符
- \t:表示制表符
- \r:表示回車符
- \0:表示字符串結(jié)束標志符需要注意的是,在字符串中使用引號時,需要使用轉(zhuǎn)義符來表示引號自身,例如:
?上面的代碼使用了轉(zhuǎn)義符“\”來表示引號自身,因為在字符串中使用引號會引起歧義。
在續(xù)行符\之前或者之后帶上空格,行不行?
C中,有一些字符,就是他的字面意思,比如'n','b','t'。
也有一些字符,本身就是特殊含義的,比如:" , ', \
轉(zhuǎn)義的本質(zhì)含義是:字面轉(zhuǎn)特殊,或者特殊轉(zhuǎn)字面。
????????在第6行中,出現(xiàn)了一個編譯錯誤,因為在printf函數(shù)中缺少一個右括號)。該行代碼的目的是要輸出一個雙引號,但是,由于雙引號也是C語言中的特殊字符,因此需要在前面加上一個反斜杠\,來表示它是一個字面量,而不是代碼中的引號。
????????在第7行中,出現(xiàn)了一個特殊字符轉(zhuǎn)義序列\(zhòng)",它表示輸出一個雙引號。
????????在第8行中,使用了特殊字符轉(zhuǎn)義序列\(zhòng)n,它表示輸出一個換行符。
????????在第9行中,使用了特殊字符轉(zhuǎn)義序列\(zhòng)t,它表示輸出一個制表符。
\n:換行符與\r:回車符之間的區(qū)別
????????在計算機文本文件中,"\n"代表換行符(Line Feed),通常被譯為"新行"。而"\r"代表回車符(Carriage Return),通常被譯為"回車"。
????????在早期的打印機、終端設備中,換行和回車都是必須的操作。當需要讓打印頭或光標移動到下一行的開頭時,需要先執(zhí)行回車操作,然后再執(zhí)行換行操作。這種習慣一直延續(xù)下來,即"回車+換行"的序列被用作一個行的結(jié)束和下一行的開始標志。
????????但是在現(xiàn)代的計算機系統(tǒng)中,通常只需要用到換行符。因此,當我們在Windows系統(tǒng)中使用記事本編輯文本文件時,換行符和回車符會被同時輸出,但是在其他平臺上,如Linux、Mac等,只會輸出換行符。
????????簡單來說,換行符是讓光標移到下一行的開頭,而回車符是讓光標移到本行的開頭。但是,現(xiàn)在通常只需要用換行符就可以了。
兩個小程序(旋轉(zhuǎn)光標、倒計時)
旋轉(zhuǎn)光標
#include<stdio.h>
#include<windows.h>
#include<string.h>
int main()
{
int index = 0;
const char* label = "|/-\\";//由于\是特殊字符,需要轉(zhuǎn)義成字面字符
//printf("%d\n", strlen(label));//4 - 個字符
while (1)
{
index %= 4;
printf("[%c]\r", label[index]);
index++;
Sleep(1000);
}
return 0;
}
????????這段代碼是一個簡單的命令行動畫,通過不斷地輸出字符 "|/-\\" 實現(xiàn)一個不斷旋轉(zhuǎn)的動畫效果。具體來說:
1. 在 main 函數(shù)中定義變量 index,用于表示當前應該輸出那個字符;
2. 定義常量指針 label,指向字符數(shù)組 "|/-\\",存儲了要輸出的四個字符;
3. 使用一個 while 循環(huán),不斷執(zhí)行以下操作:
4. 使用取模運算符將 index 的值限制在 0~3 之間,確保 index 不會越界;
5. 使用 printf 函數(shù)輸出格式化字符串 "[%c]\r",其中 %c 表示要輸出的字符,\r 表示將輸出的光標移回行首,以便下一次輸出覆蓋當前輸出;
6. 將 index 值加 1,以便下一次循環(huán)時輸出下一個字符;
7. 使用 Sleep 函數(shù)暫停一段時間,以便動畫效果更顯著;
8. 循環(huán)回到第 4 步,繼續(xù)輸出動畫。
倒計時
#include<stdio.h>
#include<windows.h>
int main()
{
int i = 9;
for (i = 9; i >= 0; i--)
{
printf("[%d]\r", i);
Sleep(1000);
}
return 0;
}
????????這段代碼是一個簡單的倒計時程序,通過循環(huán)輸出數(shù)字并使用 Sleep 函數(shù)暫停一段時間,實現(xiàn)倒計時效果。具體來說:
1. 在 main 函數(shù)中定義變量 i 并初始化為 9,用于表示當前的倒計時值;
2. 使用 for 循環(huán)從 9 開始倒數(shù),一直到 0;
3. 在循環(huán)體中,使用 printf 函數(shù)輸出格式化字符串 "[%d]\r",其中 %d 表示要輸出的數(shù)字,\r 表示將輸出的光標移回行首,以便下一次輸出覆蓋當前輸出;
4. 使用 Sleep 函數(shù)暫停一秒鐘,以便倒計時效果更顯著;
5. 循環(huán)回到第 3 步,輸出下一個數(shù)字,直到倒計時結(jié)束;
6. for 循環(huán)結(jié)束后,程序返回 0,表示正常結(jié)束。
單引號和雙引號
????????在 C 語言中,單引號和雙引號都是用于表示字面量的符號。
1. 單引號:單引號括起來的字符表示字符字面量,比如 'a', 'b', '1' 等。在程序中使用時,單引號里的字符會被編譯器轉(zhuǎn)換成該字符的 ASCII 碼或 Unicode 碼,如 'a' 對應的 ASCII 碼是 97,可以用整型變量存儲。
示例:char c = 'a';
2. 雙引號:雙引號括起來的內(nèi)容表示字符串字面量,比如 "hello","world" 等。在程序中使用時,雙引號里的字符串會被編譯器轉(zhuǎn)換成一個字符數(shù)組,以空字符 '\0' 結(jié)尾。
示例:char s[] = "hello world";
????????需要注意的是,單引號和雙引號在 C 語言中是有區(qū)別的,不能混淆。在 C 語言中,兩者不能互換使用。
//單引號是字符,雙引號是字符串
#include <stdio.h>
//不同編譯器,會有細微的差別
int main()
{
printf("%d\n", sizeof(1));
printf("%d\n", sizeof("1"));
//C99標準的規(guī)定,'a'叫做整型字符常量(integer character constant),被看成是int型
printf("%d\n", sizeof('1'));
char c = '1';
printf("%d\n", sizeof(c));
return 0;
}
????????這段代碼主要演示了 C 語言中單引號和雙引號的一些不同用法和特性。具體來說:
1. printf("%d\n", sizeof(1));:sizeof 運算符可以用于計算表達式或數(shù)據(jù)類型的大小,這里使用 sizeof(1) 計算整型常量 1 的大小,得到結(jié)果為 4,因為在大多數(shù) C 語言實現(xiàn)中,整型常量都被視為 int 類型,占用 4 個字節(jié)。
2. printf("%d\n", sizeof("1"));:使用 sizeof("1") 計算字符串字面量 "1" 的大小,結(jié)果為 2,因為字符串字面量中除了字符本身還會包含一個結(jié)尾的空字符 '\0',所以實際大小為 2 個字節(jié)。
3. printf("%d\n", sizeof('1'));:使用 sizeof('1') 計算字符字面量 '1' 的大小,結(jié)果為 4,因為字符字面量 '1' 被視為整型字符常量,類型為 int,占用 4 個字節(jié)。
4. char c = '1'; printf("%d\n", sizeof(c));:定義一個 char 類型的變量 c,初始化為字符字面量 '1',使用 sizeof(c) 計算變量 c 的大小,結(jié)果為 1,因為 char 類型占用 1 個字節(jié)。這里的字符字面量 '1' 被視為整型字符常量,只不過把整型4個字節(jié)數(shù)據(jù)寫到1個字節(jié)里,這里一直在發(fā)生截斷。
????????需要注意的是,在不同的編譯器和不同的標準下,對于整型字符常量和字符字面量的處理方式可能存在差異,建議按照標準的規(guī)定使用。下圖分別是是gcc和vs編譯環(huán)境下的結(jié)果。
'abcd'這樣寫有問題嗎?
#include<stdio.h>
#include<windows.h>
int main()
{
"";
'';//error C2137: 空字符常量
"a";
'a';
"abcd";
'abcd';//?
char c = 'abcd';//warning C4305: “初始化”: 從“int”到“char”截斷
printf("%c\n", c);// d
c = 'abcdef';// error C2015: 常量中的字符太多
c = 'abc';
printf("%c\n", c);// c
return 0;
}
????????這段代碼主要演示了 C 語言中字符串和字符字面量的使用和一些細節(jié)問題。具體來說:
1. "" 和 "a":這是兩個字符串字面量,分別表示空字符串和包含一個字符 'a' 的字符串。在編譯時,C 語言編譯器會將字符串字面量轉(zhuǎn)換為字符數(shù)組,因此在程序中可以像使用字符數(shù)組一樣使用字符串字面量。
2. '' 和 'a':這是兩個字符字面量,分別表示字符 'a' 和空字符,即不含任何字符的字符字面量。需要注意的是,在 C 語言中,字符字面量必須包含一個字符,因此使用單引號括起來的空字符是錯誤的語法。
3. "abcd" 和 'abcd':這是正確的語法,字符串字面量 "abcd" 包含 5 個字符(包括結(jié)尾的空字符),而字符字面量 'abcd'?被定義為 int,4個字節(jié)可以存放數(shù)據(jù)。
4. char c = 'abcd';:這是合法的語法,但是編譯器會發(fā)出警告(warning),提示將 int 類型的整數(shù)截斷為 char 類型。實際上,在 C 語言中,字符常量的類型被定義為 int,因此使用 char 類型的變量存儲字符常量時,會發(fā)生類型截斷。
5. c = 'abcdef';:這是錯誤的語法,因為字符字面量 'abcdef' 包含了多個字符,已經(jīng)超過了int類型的字節(jié)數(shù)。。
6. c = 'abc';:這是合法的語法,但是編譯器會發(fā)出警告(warning),提示將 int 類型的整數(shù)截斷為 char 類型。實際上,在 C 語言中,字符常量的類型被定義為 int,因此使用 char 類型的變量存儲字符常量時,會發(fā)生類型截斷。
????????需要注意的是,使用字符串和字符時,需要注意其長度和類型,避免出現(xiàn)類型不匹配或越界訪問等問題。
特殊情況
為何計算機需要字符
????????計算機需要字符是因為字符是人類交流和存儲信息的基本單位之一。在計算機的發(fā)展歷史中,最初的計算機只能處理數(shù)值數(shù)據(jù),無法處理字符和文本信息,這限制了計算機在人機交互和信息處理方面的應用。
????????在計算機中,所有的數(shù)據(jù)都是以二進制的形式存儲和處理的,即由0和1兩種狀態(tài)來表示信息。但計算機所表示的信息類型很多,比如文字、圖像、聲音等,如果直接使用0和1來表示這些信息顯然是不太現(xiàn)實的,因此我們需要一種將這些信息轉(zhuǎn)化為二進制的方法,并且能夠讓計算機正確地將其解碼回來的方法。
????????這時就出現(xiàn)了字符編碼,它是一種將文字、數(shù)字、符號等字符轉(zhuǎn)化為計算機可識別的二進制數(shù)的方法。常用的字符編碼有ASCII碼和Unicode碼,它們可以將每一個字符都映射到一個獨一無二的二進制數(shù)上。
????????例如,在ASCII碼中,每個字符都被映射到一個包含7個二進制位的數(shù)字上,可以表示128種不同的字符,包括英文字母、數(shù)字和標點符號等。而在Unicode碼中,每個字符則被映射到一個包含16個二進制位的數(shù)字上,可以表示超過13萬種不同的字符,包括各種語言的文字、符號和表情等。
????????通過使用字符編碼,計算機可以正確地將輸入的文字、圖像、聲音等信息轉(zhuǎn)化為二進制,并在需要的時候?qū)⑵浣獯a回來,實現(xiàn)信息的存儲、處理和顯示等功能。
邏輯運算符
????????C語言中的邏輯運算符有兩種,分別為邏輯與(&&)和邏輯或(||)。它們的作用如下:
1.邏輯與(&&):如果兩個操作數(shù)都為真,則表達式的值為真;否則,表達式的值為假。
2.邏輯或(||):如果兩個操作數(shù)中至少有一個為真,則表達式的值為真;否則,表達式的值為假。
//級聯(lián)兩個(多個)邏輯表達式,必須同時為真,結(jié)果才為真
//與&(按位與)是不同的概念
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
//前置++ i先自增,再使用
if ((++i < 0) && (++j > 0)) {
printf("enter if!\n");
}
printf("%d, %d\n", i, j); //1, 1
return 0;
}
//級聯(lián)兩個(多個)邏輯表達式,必須至少一個為真,結(jié)果才為真
//與|(按位或)是不同的概念
#include <stdio.h>
#include <windows.h>
int main()
{
int i = 0;
int j = 0;
//發(fā)生短路:一個條件為真,已經(jīng)不需要在看后續(xù)的條件的情況
if ((++i > 0) || (++j > 0)) { //注意更改條件
printf("enter if!\n");
}
printf("%d, %d\n", i, j); // 1, 0
system("pause");
return 0;
}
短路
????????邏輯運算符有一個特點,即只要能夠確定整個表達式的值,就會立即停止計算。這個特點稱為“短路”,執(zhí)行順序是從左到右的。主要體現(xiàn)在以下兩種情況:
1. 對于邏輯與(&&)來說,如果第一個操作數(shù)為假,則整個表達式的值一定為假,所以不會再去計算第二個操作數(shù),直接返回假。
2. 對于邏輯或(||)來說,如果第一個操作數(shù)為真,則整個表達式的值一定為真,所以不會再去計算第二個操作數(shù),直接返回真。
#include <stdio.h>
int show()
{
printf("you can see me!\n");
return 1;
}
int main()
{
int a = 0;
scanf("%d", &a);
a == 10 && show();
return 0;
}
????????這段代碼的功能是判斷用戶輸入的數(shù)是否等于10,如果等于,則調(diào)用函數(shù)show()。如果不等于,則不會調(diào)用該函數(shù)。
具體分析如下:
1. 定義了一個函數(shù)show(),其功能是輸出一段文字并返回1。
2. 在主函數(shù)中,定義了一個整型變量a,從用戶輸入中獲取值。
3. 判斷a是否等于10,并用邏輯與運算符連接show()函數(shù)的調(diào)用。由于邏輯與(&&)具有短路特性,所以只有在a等于10時,才會調(diào)用show()函數(shù)。
4. 最后返回0,表示程序運行正常結(jié)束。
#include <stdio.h>
int show()
{
printf("you can see me!\n");
return 1;
}
int main()
{
int a = 0;
scanf("%d", &a);
a == 10 || show();
return 0;
}
這段代碼的功能是判斷用戶輸入的數(shù)是否等于10,如果不等于10,則調(diào)用函數(shù)show()。如果等于10,則不會調(diào)用該函數(shù)。
具體分析如下:
1. 定義了一個函數(shù)show(),其功能是輸出一段文字并返回1。
2. 在主函數(shù)中,定義了一個整型變量a,從用戶輸入中獲取值。
3. 判斷a是否等于10,并用邏輯或運算符連接show()函數(shù)的調(diào)用。由于邏輯或(||)具有短路特性,當a不等于10時,才會調(diào)用show()函數(shù)。
4. 最后返回0,表示程序運行正常結(jié)束。
位運算符
C語言中的位運算符可以直接操作二進制數(shù)的每一位,包括按位與(&)、按位或(|)、按位異或(^)、按位取反(~)。
1. 按位與(&):兩個相應的二進制位都為1時,結(jié)果為1;否則,結(jié)果為0。
2. 按位或(|):兩個相應的二進制位都為0時,結(jié)果為0;否則,結(jié)果為1。
3. 按位異或(^):兩個相應的二進制位不同時,結(jié)果為1;否則,結(jié)果為0。
4. 按位取反(~):對操作數(shù)的每一位取反,即0變成1,1變成0。
#include <stdio.h>
int main()
{
/*
2的補碼:0000 0000 0000 0000 0000 0000 0000 0010
3的補碼:0000 0000 0000 0000 0000 0000 0000 0011
*/
//|:兩個相應的二進制位都為0時,結(jié)果為0;否則,結(jié)果為1。
// 0000 0000 0000 0000 0000 0000 0000 0011 - 3
printf("%d\n", 2 | 3);
//&:兩個相應的二進制位都為1時,結(jié)果為1;否則,結(jié)果為0。
// 0000 0000 0000 0000 0000 0000 0000 0010 - 2
printf("%d\n", 2 & 3);
//^:兩個相應的二進制位不同時,結(jié)果為1;否則,結(jié)果為0。
// 0000 0000 0000 0000 0000 0000 0000 0001 - 1
printf("%d\n", 2 ^ 3);
//~:對操作數(shù)的每一位(包括符號位)取反,即0變成1,1變成0。
// 1111 1111 1111 1111 1111 1111 1111 1111 - 補碼
// 1111 1111 1111 1111 1111 1111 1111 1110 - 反碼
// 1000 0000 0000 0000 0000 0000 0000 0001 - 原碼 - -1
printf("%d\n", ~0);
return 0;
}
&& vs &、|| vs |的區(qū)別
&& vs &
&&:級聯(lián)的是多個邏輯表達式,需要的是真假結(jié)果
& :級聯(lián)的是多個數(shù)據(jù),逐比特位進行位運算
邏輯結(jié)果:吃了嗎?
數(shù)據(jù)結(jié)果:吃了多少?
|| vs | 同上
關于^的理解
????????在C語言中,符號“^”是按位異或運算符。它是一個二元運算符,將兩個操作數(shù)的二進制表示逐位比較,如果相應的位上一個操作數(shù)為1,另一個為0,則結(jié)果為1,否則結(jié)果為0。
// ^ : 逐比特位,相同為0,相異為1
//任何數(shù)和0異或,都是它本身
#include <stdio.h>
int main()
{
/*
3的補碼:0000 0000 0000 0000 0000 0000 0000 0011
0的補碼:0000 0000 0000 0000 0000 0000 0000 0000
-3的補碼:1111 1111 1111 1111 1111 1111 1111 1101
*/
//任何數(shù)和0異或,都是它本身
//0000 0000 0000 0000 0000 0000 0000 0011
//0000 0000 0000 0000 0000 0000 0000 0000
//0000 0000 0000 0000 0000 0000 0000 0011 - 3
printf("%d\n", 3 ^ 0);
//0000 0000 0000 0000 0000 0000 0000 0000
//0000 0000 0000 0000 0000 0000 0000 0000
//0000 0000 0000 0000 0000 0000 0000 0000 - 0
printf("%d\n", 0 ^ 0);
//1111 1111 1111 1111 1111 1111 1111 1101
//0000 0000 0000 0000 0000 0000 0000 0000
//1111 1111 1111 1111 1111 1111 1111 1101 - -3
printf("%d\n", -3 ^ 0);
return 0;
}
總結(jié):任何數(shù)和0異或,都是它本身。
#include<stdio.h>
// ^ : 支持結(jié)合律和交換律
//任何一個數(shù)和自身異或的結(jié)果都是0
int main()
{
/*
3的補碼:0000 0000 0000 0000 0000 0000 0000 0011
1的補碼:0000 0000 0000 0000 0000 0000 0000 0001
*/
/*
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0010 - 3 ^ 1的結(jié)果
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0001 - 3 ^ 1 ^ 3的結(jié)果 - 1
*/
printf("%d\n", 3 ^ 1 ^ 3);
/*
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0000 - 3 ^ 3的結(jié)果
0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0001 - 3 ^ 3 ^ 1的結(jié)果 - 1
*/
printf("%d\n", 3 ^ 3 ^ 1);
/*
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0010 - (3 ^ 1)的結(jié)果
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0001 - 3 ^ (3 ^ 1)的結(jié)果 - 1
*/
printf("%d\n", 3 ^ (3 ^ 1));
return 0;
}
1、^ : 支持結(jié)合律和交換律。
2、任何一個數(shù)和自身異或的結(jié)果都是0。
通過異或交換兩個整數(shù)
常規(guī)寫法
//容易出現(xiàn)溢出問題
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a + b;
b = a - b;
a = a - b;
return 0;
}
為什么會有溢出的問題呢?
????????在C語言中,當執(zhí)行二進制位運算時,如果結(jié)果超過了變量的可表示范圍,就會發(fā)生溢出。
????????假設我們有一個32位有符號整數(shù),其最大值為2,147,483,647,最小為-2,147,483,648?,F(xiàn)在假設我們要對其執(zhí)行以下操作:
```
int a = 2147483647;
int b = a + 1;
```由于a已經(jīng)達到了整數(shù)的最大值,因此b的值將溢出。在這種情況下,b將是-2,147,483,648,這是整數(shù)的最小值。
????????這是因為有符號整數(shù)的最高位(即最左側(cè)位)表示符號,0表示正數(shù),1表示負數(shù)。因此,當最高位是1時,整數(shù)的值將為負數(shù),且符號位不參與位運算。在這種情況下,當b的值達到2,147,483,648時,它的最高位將變?yōu)?,導致整數(shù)的值為負數(shù)。由于它的符號位不參與運算,因此結(jié)果是 -2147483648。
????????因此,在進行運算時,你需要確保結(jié)果不會超出變量所能表示的范圍,否則會導致意外的結(jié)果??梢允褂靡恍┘记?,如類型轉(zhuǎn)換或適當?shù)囊莆粊肀苊膺@種情況。
異或?qū)懛?/p>
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
return 0;
}
?
設置指定的比特位為1文章來源:http://www.zghlxwxcb.cn/news/detail-447613.html
#include<stdio.h>
//任何數(shù)或0保持不變
//任何數(shù)或1結(jié)果為1
#define SETBIT(x,n) x|=(1<<(n-1))
void ShowBits(int x)
{
//按位與獲取每一位值
int num = sizeof(x) * 8 - 1;
while (num >= 0)
{
if (x & (1 << num))
{
printf("1 ");
}
else
{
printf("0 ");
}
num--;
}
printf("\n");
}
int main()
{
int x = 0;
//設置指定的比特位為1
SETBIT(x, 5);
//0000 0000 0000 0000 0000 0000 0001 0000
//顯示所有的比特位
ShowBits(x);
return 0;
}
設置指定的比特位為0文章來源地址http://www.zghlxwxcb.cn/news/detail-447613.html
#include<stdio.h>
//任何數(shù)與0結(jié)果為0 0 & 0,0 & 1 - 0 - 0
//任何數(shù)與1保持不變 0 & 1,1 & 1 - 0 - 1
#define SETBIT(x,n) x&=(~(1<<(n-1)))
void ShowBits(int x)
{
//按位與獲取每一位值
int num = sizeof(x) * 8 - 1;
while (num >= 0)
{
if (x & (1 << num))
{
printf("1 ");
}
else
{
printf("0 ");
}
num--;
}
printf("\n");
}
int main()
{
int x = 2;
//設置指定的比特位為1
SETBIT(x, 2);
//0000 0000 0000 0000 0000 0000 0000 0010
//&
//1111 1111 1111 1111 1111 1111 1111 1101 取反
//0000 0000 0000 0000 0000 0000 0000 0000
//顯示所有的比特位
ShowBits(x);
return 0;
}
到了這里,關于learn_C_deep_10 深刻認識C語言重點操作符的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!