嫒美直播免费版app下载-嫒美直播永久免费版下载-嫒美直播最新下载安装

當(dāng)前位置:首頁(yè) > 教育綜合 > 正文

有哪位大佬明白,解釋一下我這里為什么報(bào)錯(cuò)?

java 大佬求教一下這里為什么會(huì)錯(cuò)誤

符號(hào)優(yōu)先級(jí)的問(wèn)題 a=x>0 先執(zhí)行的是x>0,為false, 而a=false是表達(dá)式,不能進(jìn)行&操作。 下面的同理

C++,大佬們看下這里報(bào)錯(cuò)是為什么?可是這代碼能AC???!


作者 |梁唐責(zé)編 | 歐陽(yáng)姝黎



今天給大家聊聊C++中的頭文件,之前我在寫算法專題展示源代碼的時(shí)候,很多小伙伴給我留言說(shuō)被我的頭文件中的內(nèi)容震驚了。其實(shí)之所以我的頭文件這么復(fù)雜,完全是因?yàn)樗俏乙恢睆拇髮W(xué)時(shí)期acm競(jìng)賽當(dāng)中沿用下來(lái)的。對(duì)于acm競(jìng)賽的選手們來(lái)說(shuō),這樣的頭文件其實(shí)算是小兒科了。

今天就和大家來(lái)看看,acmer 的頭文件當(dāng)中都藏著哪些秘密。

首先,我們先來(lái)看我完整的頭文件代碼。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define rep(i,a,b) for (int i=a;i#define Rep(i,a,b) for (int i=a;i>b;i--)
#define foreach(e,x) for (__typeof(x.begin()) e=x.begin();e!=x.end();e++)
#define mid ((l+r)>>1)
#define lson (k<<1)
#define rson (k<<1|1)
#define MEM(a,x) memset(a,x,sizeof a)
#define pii pair
#define LL long long
usingnamespacestd;
constint N=500005;
constlonglong Mod=99997867;

請(qǐng)點(diǎn)擊輸入圖片描述

include部分


首先我們來(lái)看 include 的部分,我們一個(gè)一個(gè)來(lái)看,iostream 不用多說(shuō)了,C++標(biāo)準(zhǔn)輸入輸出的頭文件,包含了 C++輸入輸出流函數(shù),也就是經(jīng)典的 cin、cout。說(shuō)到 cin、cout 多說(shuō)兩句,cin、cout 的開銷要比 C 語(yǔ)言下的 scanf 和 printf 慢很多,很容易影響程序運(yùn)行的性能。所以對(duì)于 acmer 來(lái)說(shuō),能用 scanf 和 printf 完成的,就絕對(duì)不會(huì)用 cin、cout。當(dāng)然 scanf 和 printf 也不是最快的,還有更快的 getchar 和 putchar,所以有些玩家會(huì)自己手寫循環(huán)讀入 char 然后轉(zhuǎn)成 int 或者是 float 的函數(shù),當(dāng)然絕大多數(shù)情況下并不需要這樣。

cstdio 和 iostream 同樣的功能,不過(guò)是 C 語(yǔ)言中的輸入輸出函數(shù),不多說(shuō)。

cstring 同樣屬于 C 語(yǔ)言,是 C 語(yǔ)言中的字符串庫(kù),有很多字符串相關(guān)的函數(shù)。同樣由于性能的原因,能用 C 語(yǔ)言中 char[]完成的就不用使用 C++的 string。接下來(lái)的 string 庫(kù)也不用多說(shuō),C++的字符串處理庫(kù)。

cstdlib 庫(kù)函數(shù)等同于 C 語(yǔ)言中 stdlib.h,封裝了一些常用的庫(kù)函數(shù),如 rand、srand、free、malloc 等。

cmath 庫(kù)等于 C 語(yǔ)言中的 math.h,封裝了一些數(shù)學(xué)運(yùn)算相關(guān)的庫(kù)函數(shù),如 pow、sqrt 等。

后面的 queue、vector、map、set 都是 STL 庫(kù),包含了一些比較好用的數(shù)據(jù)結(jié)構(gòu)。比如 queue 中封裝了 queue 以及 dequeue,和 priority_queue,也就是隊(duì)列、雙端隊(duì)列和優(yōu)先隊(duì)列。vector、map、set 分別是線性表、映射表以及集合,熟練使用它們可以極大的降低編碼的復(fù)雜度。

algorithm 庫(kù)翻譯過(guò)來(lái)就是算法庫(kù),當(dāng)中自然封裝了不少的算法。比如 sort 排序、reverse 翻轉(zhuǎn)、next_permutation 下一個(gè)全排列、lower_bound、upper_bound 函數(shù)等。

最后一個(gè) functional 庫(kù),用得不多,顧名思義當(dāng)中封裝了一些關(guān)于函數(shù)對(duì)象的操作。比如 bind、reference_wrapper 等等。

其實(shí)關(guān)于 include,有一個(gè)取巧的方法可以一次性 include 所有的頭文件:

#include

不過(guò)這種方法有一個(gè)小問(wèn)題,并不是所有的環(huán)境都支持,尤其是在正式比賽的場(chǎng)合,所以一般情況下大家都是一些網(wǎng)絡(luò)賽才會(huì)用它,我個(gè)人由于懶得區(qū)分環(huán)境,所以還是習(xí)慣自己一個(gè)一個(gè) include。


請(qǐng)點(diǎn)擊輸入圖片描述

define部分


define 是 C++ 當(dāng)中非常強(qiáng)大的功能,它可以定義規(guī)則對(duì)代碼進(jìn)行替換。熟練使用 define 同樣可以大大簡(jiǎn)化編碼。但是要注意,凡事不能過(guò)度,如果 define 使用過(guò)多會(huì)影響程序的可讀性,也可能對(duì)其他人的編碼造成影響。所以很多大公司是禁止使用 define 的,我個(gè)人倒覺(jué)得其實(shí)也不用這么嚴(yán)肅,define 可以用,遵守規(guī)范,適當(dāng)使用就可以了。

首先是這兩行,是 for-loop 的 define。

#define rep(i,a,b) for (int i=a;i#define Rep(i,a,b) for (int i=a;i>b;i--)
#define foreach(e,x) for (__typeof(x.begin()) e=x.begin();e!=x.end();e++)

rep 是 repeat 的縮寫,使用的時(shí)候只需要 rep(i, a, b)就可以代替冗長(zhǎng)的 for 循環(huán)的編寫,其中 i 是循環(huán)變量,a 和 b 分別是循環(huán)的上下界,注意是左閉右開區(qū)間。

Rep 也是同樣的邏輯,只不過(guò)是倒序的循環(huán)。

foreach 使用的是 C++11 的新特性,可以實(shí)現(xiàn)自動(dòng)迭代,用的不多,在一些場(chǎng)景下非常方便。

#define mid ((l+r)>>1)

這行用在二分查找當(dāng)中,左邊界是 l,右邊界是 r,那么它們的中點(diǎn)就是(l + r) / 2,用位運(yùn)算表示就是:(l + r) >> 1。例子:

# define之前
while (l + 1 < r) {
int m = (l + r) >> 1;
if (a[m] <= v) {
l = m;
}else {
r = m;
}
}
# define之后
while (l + 1 < r) {
if (a[mid] <= v) {
l = mid;
}else {
r = mid;
}
}
#define lson (k<<1)
#define rson (k<<1|1)

這兩行主要是用在線段樹上,因?yàn)?C++ 往往不使用類來(lái)實(shí)現(xiàn)線段樹,而是通過(guò)數(shù)組來(lái)模擬實(shí)現(xiàn)。在線段樹當(dāng)中,如果某一個(gè)節(jié)點(diǎn)的 id 是 u,那么它的左孩子是 2 x u,右孩子的 id 是 2 x u + 1,用位運(yùn)算來(lái)表示就是 u << 1 和 u << 1 | 1。

#define MEM(a,x) memset(a,x,sizeof a)
#define pii pair
#define LL long long

最后三行放在一起說(shuō),第一行是 memset 的縮寫,memset 可以用來(lái)初始化數(shù)組。pii 縮寫了 pair,pair 是用來(lái)綁定兩個(gè)變量的數(shù)據(jù)結(jié)構(gòu)。最后是 LL 縮寫了 long long,long long 是 64 位的 int,它的范圍要比 int 大得多。

關(guān)于類型的重定義,這里使用 define 并不是非常好,更好的方法是使用 typedef,例如上面的 pair 和 long long 可以寫成:

typedef pair pii;
typedeflonglong LL;

相比 define 之下這樣更規(guī)范一些,因?yàn)?define 是生硬的字符串替換,而 typedef 則是類型別名,能夠被編譯器檢查,所以能使用 typedef 還是使用 typedef。


請(qǐng)點(diǎn)擊輸入圖片描述

尾聲


除了上面用到的這些頭文件之外,還有一些更高端的用法,比如一些模板類,以及一些常用的算法,比如 gcd 等等。但我個(gè)人覺(jué)得意義不是非常大,對(duì)于面試、筆試的代碼環(huán)節(jié)來(lái)說(shuō),以上的這些頭文件已經(jīng)足夠使用了。



蘋果iCloud(貴安)數(shù)據(jù)中心投入運(yùn)行;網(wǎng)易公布不當(dāng)言論HR處理結(jié)果:已開除;OceanBase數(shù)據(jù)庫(kù)將開源|極客頭條

程序員35歲就該退休了嗎?

從“不作惡”到“門就在那邊”,谷歌 AI 倫理史

有沒(méi)有懂計(jì)算機(jī)的大佬,幫個(gè)忙,為什么我的虛擬機(jī)一直報(bào)錯(cuò)

虛擬機(jī)里的系統(tǒng),也需要安裝,安裝方式跟主機(jī)差不多,因?yàn)槟阆螺d的是鏡像版,所以需要加載虛擬光驅(qū),導(dǎo)入鏡像文件,然后在虛擬機(jī)里用U盤pe系統(tǒng)或者光驅(qū)啟動(dòng),分區(qū)格式化,安裝系統(tǒng)

steam 一登錄就顯示這個(gè) ,哪位大佬知道咋解決?

卸載重裝或者用freemove這種工具移動(dòng)steam安裝目錄至純英文安裝路徑。


這個(gè)報(bào)錯(cuò)是因?yàn)閟team安裝路徑中出現(xiàn)了中文導(dǎo)致steam無(wú)法識(shí)別導(dǎo)致的。,參考我的安裝路徑D/steam,安裝位置可以隨意,因?yàn)橄螺d游戲時(shí)可以自定義游戲安裝位置,不必?fù)?dān)心占滿了軟件安裝磁盤。

大佬求解 為什么局部指針會(huì)報(bào)錯(cuò)?

總體邏輯過(guò)程是這樣的:

sList *L1;
L1 = createList(L1, 10, a); //看似沒(méi)有什么問(wèn)題,但createList里使用了L1,而這個(gè)L1是個(gè)沒(méi)有初始化的指針,是個(gè)野指針,雖然在createList里重新對(duì)L1賦值并返回,但編譯器并不知道createList將如何操作L1(因?yàn)閰?shù)里的L1僅僅是個(gè)副本,編譯器并不知道最后會(huì)返回這個(gè)副本的值給main的L1),所以報(bào)錯(cuò)。一個(gè)野指針當(dāng)作函數(shù)參數(shù)時(shí),編譯器報(bào)錯(cuò)是負(fù)責(zé)的行為

你這個(gè)代碼里正常的做法應(yīng)該是這樣:

sList*createList(intn,inta[])//這里不要L1了
{
inti=0,k=0;
sList*L1=(sList*)malloc(sizeof(sList));//這里產(chǎn)生L1
while(i {
L1->data[i]=a[i];
i++;k++;
}
L1->length=k;
returnL1;
}
修改后的代碼:
#include
#include
typedefstruct
{
intdata[50];
intlength;
}sList;
sList*createList(intn,inta[])
{
inti=0,k=0;
sList*L1=(sList*)malloc(sizeof(sList));
while(i {
L1->data[i]=a[i];
i++;k++;
}
L1->length=k;
returnL1;
}
intmain()
{
sList*L1;
inta[10],i=0;
while(i<10)
{
scanf("%d",&a[i]);
i++;
}
L1=createList(10,a);
//......
free(L1);
return0;
}
展開全文閱讀