網(wǎng)站首頁 編程語言 正文
前言
最近學習遇到了很多小難題,今天這篇博客就來記錄一下最近學習所遇到的一些困惑我的地方,以便于復習。
一、關于關鍵字static
在C語言中:
static是用來修飾變量和函數(shù)的
- 修飾局部變量-稱為靜態(tài)局部變量
- 修飾全局變量-稱為靜態(tài)全局變量
- 修飾函數(shù)-稱為靜態(tài)函數(shù)
下面我們用代碼來解釋一下static在c語言中的應用
1.static修飾局部變量
//第一組代碼
#include <stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);//1 1 1 1 1 1 1 1 1 1
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
//第二組代碼
#include <stdio.h>
void test()
{
//static修飾局部變量
static int i = 0;
i++;
printf("%d ", i);//1 2 3 4 5 6 7 8 9 10
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
代碼一:輸出為 1 1 1 1 1 1 1 1 1 1
代碼二:輸出為 1 2 3 4 5 6 7 8 9 10
所以static修飾局部變量改變了變量的生命周期,讓靜態(tài)局部變量出了作用域依然存在,到程序結束,生命周期才結束。 簡單來說就是static把原本在棧區(qū)上的局部變量挪到了靜態(tài)區(qū),即 可以使變量出了作用域之后不銷毀。
2.static修飾全局變量
在這里我們需要在一個工程里面開辟2個.c文件,方便我們更清晰的看出static的作用
//代碼一
//add.c
int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);//2018
return 0;
}
//代碼2
//add.c
static int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);//會報錯
return 0; }
代碼一:輸出 2018
代碼二:在編譯的時候會出現(xiàn)連接性錯誤
所以我們可以得出結論 :一個全局變量被static修飾,使得這個全局變量只能在本源文件內使用,不能在其他源文件內使用。
3.static修飾函數(shù)
我們也需要在一個工程內開辟2個.c文件方便我們觀察
//代碼1
//add.c
int Add(int x, int y)
{
return x+y;
}
//test.c
int main()
{
printf("%d\n", Add(2, 3));// 5
return 0;
}
//代碼2
//add.c
static int Add(int x, int y)
{
return c+y;
}
//test.c
int main()
{
printf("%d\n", Add(2, 3));//報錯
return 0;
}
代碼一:輸出 5
代碼二:在編譯的時候會出現(xiàn)連接性錯誤
所以一個函數(shù)被static修飾,使得這個函數(shù)只能在本源文件內使用,不能在其他源文件內使用。
二、sizeof和strlen的區(qū)別
我們首先必須知道sizeof是關鍵字!!
strlen是函數(shù)!! 兩者有著質的區(qū)別
1.sizeof
在c語言中,sizeof在頭文件中的類型為unsigned int ,
他的參數(shù)可以是指針、數(shù)組、類型、對象、函數(shù)等等
2.strlen
在c語言中,strlen()是函數(shù),所以在使用它的時候,就有對應的頭文件 <string.h> ,他和sizeof在參數(shù)上不同的是,strlen的參數(shù)只有字符型指針。
二者區(qū)別
二者計算指針長度
眾所周知字符串數(shù)組后面會默認有 ‘\0’ ,下面我們用代碼來看看二者的區(qū)別
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = { "abcd" };
printf("%d\n", sizeof(arr));// 5
printf("%d\n", strlen(arr));// 4
return 0;
}
sizeof遇到 ‘\0’ 時會將 ‘\0’ 算入
strlen從第一個地址開始遍歷,遇到 ‘\0’ (NULL)會立刻返回,但是返回的長度并不包括 ‘\0’
因此 sizeof在字符串數(shù)組內返回的長度總是比strlen多一個
下面我們用代碼來解釋sizeof和stlen的不同
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = { 'a','b','c','d'};
printf("%d\n", sizeof(arr));// 4
//一個字符在內存中占一個字節(jié),4個字符就占4個字節(jié),所以輸出4
printf("%d\n", strlen(arr));// 15
//因為字符數(shù)組并不會默認字符最后有'\0',所以編譯器就會一直往后找,直到找到'\0'
//但是此時'\0'是隨機的,這取決于編譯器,如果在其他編譯器內運行 打印的結果可能就是其他大于4的隨機數(shù),下面我有貼圖片
char arr1[]={'a','b','c','d','\0'};
printf("%d\n", strlen(arr1));// 4
return 0;
}
三、關于if()內部>與<的正確使用
首先我們來看一道題目
我相信大家剛開始看到這道題目的時候一定和我一樣不理解,字符 ‘c’ 不是比字符 ‘m’ 小嗎,這樣打印出來的不應該是no嗎,可是為什么打印出來的是yes呢?
我們是這樣解釋的:在c語言中,編譯器都是從左到右依次判斷,因此編譯器會先判斷字符 ‘c’ 是否比字符 ‘m’ 大,顯而易見是假的,因此前面就變成了0,表示假,然后就會判斷0是否比字符 ==‘z’==小,顯而易見 0比 ==‘z‘==小,因此if語句里面的就是真的,所以我們會打印出 yes。
但是怎樣才會打印出我們想要的結果呢?看下面的代碼
當我們用 ==&&==這個符號連接時,if語句里面的意思就是 字符’c‘<‘m’ 且字符’c‘>'m’是打印yes,這就是我們想要的結果了。
原文鏈接:https://blog.csdn.net/weixin_64634186/article/details/124484859
相關推薦
- 2022-11-07 Python實現(xiàn)簡易凱撒密碼的示例代碼_python
- 2022-09-19 Golang如何編寫內存高效及CPU調優(yōu)的Go結構體_Golang
- 2022-04-12 【scp】Windows 下scp報錯 bad permissions
- 2022-04-06 python數(shù)據(jù)分析實戰(zhàn)指南之異常值處理_python
- 2022-12-24 如何計算?tensorflow?和?pytorch?模型的浮點運算數(shù)_python
- 2022-10-22 Kotlin匿名函數(shù)使用介紹_Android
- 2022-05-22 關于VS2022不能使用<bits/stdc++.h>的解決方案(萬能頭文件)_C 語言
- 2022-06-15 python?OpenCV?圖像通道數(shù)判斷_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支