国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

learn_C_deep_10 深刻認識C語言重點操作符

這篇具有很好參考價值的文章主要介紹了learn_C_deep_10 深刻認識C語言重點操作符。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

注釋符號

其他注釋方法

注釋建議

接續(xù)符和轉(zhuǎn)義符

在續(xù)行符\之前或者之后帶上空格,行不行?

\n:換行符與\r:回車符之間的區(qū)別

兩個小程序(旋轉(zhuǎn)光標、倒計時)

單引號和雙引號

?'abcd'這樣寫有問題嗎?

特殊情況

為何計算機需要字符

邏輯運算符

短路

位運算符

&& vs &、|| vs |的區(qū)別

關于^的理解

通過異或交換兩個整數(shù)

注釋符號

????????在C語言中,注釋指的是在程序代碼中添加的一些說明或標記,這些注釋并不會被編譯器解析和執(zhí)行,僅僅是為了幫助程序員更好地理解代碼。

C語言中支持兩種注釋方式:

1. 單行注釋:使用“//”符號標記注釋內(nèi)容,從“//”開始到該行結(jié)尾處都被視為注釋,編譯器會忽略這些內(nèi)容。

例如:

learn_C_deep_10 深刻認識C語言重點操作符

2. 多行注釋:使用“/*”和“*/”符號包含多行注釋內(nèi)容,從“/*”開始到“*/”結(jié)束的所有內(nèi)容都被視為注釋,編譯器會忽略這些內(nèi)容。

例如:

learn_C_deep_10 深刻認識C語言重點操作符

注釋是一種很重要的編程技巧,它可以增強代碼的可讀性和可維護性,方便其他人或自己在之后修改代碼。

#include<stdio.h>
int main()
{
	int /* */ i; //正確
	char* s = "abcd //xyz"; //正確
	//Is it a\
	valid comment? //正確
	in/* */t j; //報錯
	return 0;
}

learn_C_deep_10 深刻認識C語言重點操作符

注意:注釋被替換,本質(zhì)是替換成空格。

learn_C_deep_10 深刻認識C語言重點操作符

# 和 define之間是可以帶空格的。

learn_C_deep_10 深刻認識C語言重點操作符

1.c語言風格注釋無法嵌套

2./*總是與離它最近的*/匹配

learn_C_deep_10 深刻認識C語言重點操作符

其他注釋方法

//基于條件編譯,代碼編譯期間處理
#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)體。

learn_C_deep_10 深刻認識C語言重點操作符

接續(xù)符和轉(zhuǎn)義符

????????在C語言中,續(xù)行符和轉(zhuǎn)義符都是用來對特殊字符進行處理和表示的。它們的作用與用途是不同的,下面我來簡單解釋一下:

1. 續(xù)行符

續(xù)行符是用來將一行過長的代碼分割成多行的特殊字符,以便于閱讀和編寫。在C語言中,續(xù)行符使用反斜線符號“\”來表示,用在需要跨行的地方的末尾處。

例如:

learn_C_deep_10 深刻認識C語言重點操作符

?使用續(xù)行符后,上面的代碼可以分為三行來編寫,其結(jié)果和不使用續(xù)行符的代碼是一樣的。

2. 轉(zhuǎn)義符

轉(zhuǎn)義符是用來表示一些特殊字符的符號。在C語言中,轉(zhuǎn)義符使用反斜線符號“\”配合后面的字符來表示,常用的轉(zhuǎn)義符有:

- \n:表示換行符
- \t:表示制表符
- \r:表示回車符
- \0:表示字符串結(jié)束標志符

需要注意的是,在字符串中使用引號時,需要使用轉(zhuǎn)義符來表示引號自身,例如:

learn_C_deep_10 深刻認識C語言重點操作符

?上面的代碼使用了轉(zhuǎn)義符“\”來表示引號自身,因為在字符串中使用引號會引起歧義。

在續(xù)行符\之前或者之后帶上空格,行不行?

learn_C_deep_10 深刻認識C語言重點操作符

C中,有一些字符,就是他的字面意思,比如'n','b','t'。

也有一些字符,本身就是特殊含義的,比如:" , ', \

轉(zhuǎn)義的本質(zhì)含義是:字面轉(zhuǎn)特殊,或者特殊轉(zhuǎn)字面。

learn_C_deep_10 深刻認識C語言重點操作符

????????在第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等,只會輸出換行符。

learn_C_deep_10 深刻認識C語言重點操作符

????????簡單來說,換行符是讓光標移到下一行的開頭,而回車符是讓光標移到本行的開頭。但是,現(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é)果。

learn_C_deep_10 深刻認識C語言重點操作符

'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;
}

learn_C_deep_10 深刻認識C語言重點操作符

????????這段代碼主要演示了 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)類型不匹配或越界訪問等問題。

特殊情況

learn_C_deep_10 深刻認識C語言重點操作符

為何計算機需要字符

????????計算機需要字符是因為字符是人類交流和存儲信息的基本單位之一。在計算機的發(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)信息的存儲、處理和顯示等功能。

learn_C_deep_10 深刻認識C語言重點操作符

邏輯運算符

????????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;
}

learn_C_deep_10 深刻認識C語言重點操作符

為什么會有溢出的問題呢?

????????在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;
}

learn_C_deep_10 深刻認識C語言重點操作符

?

設置指定的比特位為1

#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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 自然語言處理(七): Deep Learning for NLP: Recurrent Networks

    自然語言處理(七): Deep Learning for NLP: Recurrent Networks

    目錄 1.?N-gram Language Models 2. Recurrent Neural Networks 2.1 RNN Unrolled 2.2 RNN Training 2.3 (Simple) RNN for Language Model 2.4 RNN Language Model: Training 2.5 RNN Language Model: Generation 3.?Long Short-term Memory Networks 3.1?Language Model… Solved? 3.2 Long Short-term Memory (LSTM) 3.3 Gating Vector 3.4 Simple RNN vs. LSTM 3.5 LSTM: Forget

    2023年04月13日
    瀏覽(47)
  • Deep Learning-學習筆記

    deep learning訓練過程 如果對所有層同時訓練,時間復雜度會太高;如果每次訓練一層,偏差就會逐層傳遞。這會面臨跟上面監(jiān)督學習中相反的問題,會嚴重欠擬合(因為深度網(wǎng)絡的神經(jīng)元和參數(shù)太多了)。 2006年,hinton提出了在非監(jiān)督數(shù)據(jù)上建立多層神經(jīng)網(wǎng)絡的一個有效方法,

    2024年02月12日
    瀏覽(22)
  • deep learning 代碼筆記

    deep learning 代碼筆記

    len (X)總是返回第0軸的長度。 What are the shapes of summation outputs along axis 0, 1, and 2? f ( x ) = ||? x|| ? 2 的梯度 自動微分法計算: 因此,梯度是x的單位向量。在x = 0處的梯度在數(shù)學上是未定義的,但是自動微分返回零。要小心,在這種情況下可能會出現(xiàn)差異。 默認情況下,最后一

    2024年02月21日
    瀏覽(26)
  • MATLAB Deep learning

    MATLAB Deep learning

    深度學習是一種機器學習,而機器學習是一種人工智能。 機器學習的本質(zhì) :機器學習是一種從“數(shù)據(jù)”中找到“模型”的技術。在這里,數(shù)據(jù)的字面意思是指文檔、音頻、圖像等信息。這個“模型”是機器學習的最終產(chǎn)物。 機器學習的創(chuàng)建是為了 解決分析模型幾乎不可用的

    2024年01月17日
    瀏覽(42)
  • The Deep Learning AI for Environmental Monitoring——Deep

    作者:禪與計算機程序設計藝術 環(huán)境監(jiān)測是整個經(jīng)濟社會發(fā)展的一個重要環(huán)節(jié),環(huán)境數(shù)據(jù)是影響經(jīng)濟、金融、社會和政策走向的不可或缺的組成部分。目前,環(huán)境監(jiān)測主要依靠地面站(例如氣象臺)或者衛(wèi)星遙感影像獲取的數(shù)據(jù)進行實時監(jiān)測,其精確度受到數(shù)據(jù)源和采集技術

    2024年02月08日
    瀏覽(24)
  • Tips for Deep Learning

    Tips for Deep Learning

    目錄 Recipe of Deep Learning ?Good Results on Training Data? New activation function Adaptive learning rate Good Results on Testing Data? Early Stopping Regularization Dropout 我們要做的第一件事是,提高model在training set上的正確率,然后要做的事是,提高model在testing set上的正確率。 這一部分主要講述如何在

    2024年02月05日
    瀏覽(24)
  • 《Dive into Deep Learning》

    《Dive into Deep Learning》

    《Dive into Deep Learning》:https://d2l.ai/ Interactive deep learning book with code, math, and discussions Implemented with PyTorch, NumPy/MXNet, JAX, and TensorFlow Adopted at 500 universities from 70 countries 《動手學深度學習》中文版:https://zh.d2l.ai/chapter_preface/index.html 課程安排: https://courses.d2l.ai/zh-v2/

    2024年02月11日
    瀏覽(18)
  • 《Learning to Reweight Examples for Robust Deep Learning》筆記

    [1] 用 meta-learning 學樣本權重,可用于 class imbalance、noisy label 場景。之前對其 (7) 式中 ? i , t = 0 epsilon_{i,t}=0 ? i , t ? = 0 ( 對應 Algorithm 1 第 5 句、代碼 ex_wts_a = tf.zeros([bsize_a], dtype=tf.float32) )不理解:如果 ? epsilon ? 已知是 0,那 (4) 式的加權 loss 不是恒為零嗎?(5) 式不是

    2024年01月23日
    瀏覽(28)
  • 可信深度學習Trustworthy Deep Learning相關論文

    可信深度學習Trustworthy Deep Learning相關論文

    Survey An Overview of Catastrophic AI Risks. [paper] Connecting the Dots in Trustworthy Artificial Intelligence: From AI Principles, Ethics, and Key Requirements to Responsible AI Systems and Regulation. [paper] A Survey of Trustworthy Federated Learning with Perspectives on Security, Robustness, and Privacy. [paper] Adversarial Machine Learning: A Systemati

    2024年02月13日
    瀏覽(24)
  • AIGC實戰(zhàn)——深度學習 (Deep Learning, DL)

    AIGC實戰(zhàn)——深度學習 (Deep Learning, DL)

    深度學習 ( Deep Learning , DL ) 是貫穿所有生成模型 ( Generative Model ) 的共同特征,幾乎所有復雜的生成模型都以深度神經(jīng)網(wǎng)絡為核心,深度神經(jīng)網(wǎng)絡能夠?qū)W習數(shù)據(jù)結(jié)構中的復雜關系,而不需要預先提取數(shù)據(jù)特征。在本節(jié)中,我們將介紹深度學習基本概念,并利用 Keras 構建深度神

    2024年02月08日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包