日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

asin c语言中 返回值范围_大学C语言考试易错知识点总结

發布時間:2025/3/19 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asin c语言中 返回值范围_大学C语言考试易错知识点总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:cggwz

來源:https://blog.csdn.net/cggwz/article/details/103740713?utm_medium=distribute.pc_relevant.none-task-blog-utm_term-2&spm=1001.2101.3001.4242

文章目錄

  • 運算符相關

    • 自增(減)前后綴

    • 邏輯運算符的短路問題

    • 賦值運算符的返回值問題

    • 運算符優先級的問題

    • sizeof()的返回值問題

  • 函數相關

    • 函數聲明問題

    • mian函數參數問題

  • 變量相關

    • 用字符串初始化字符數組

    • 賦初值問題

    • 轉義字符問題

    • 常用ASCII碼記憶

    • 字符串常量占用內存問題

    • 字符變量值的問題

    • 變量類型的范圍計算問題

    • 字符串常量拼接問題

  • 數組相關

    • 數組下標越界

    • 二維數組中行列計算問題

    • 字符數組賦值問題

  • 結構體相關

    • 結構體所包含的變量不可初始化

    • 查看結構體內部變量所占內存大小

  • 庫函數相關

    • 絕對值函數

    • scanf()和printf()的返回值問題

    • fclose()的返回值問題

  • 預編譯相關

    • 注意宏定義的替換原則

  • 后記


現在不少大學都把C語言作為一門必學的編程語言。C語言考試呢,并不能決定你的實踐能力怎么樣,他考的很多點,我們不知道,也可以在寫代碼時避免,我們舉個最簡單的例子,運算符優先級,這恐怕是必考的內容了。但實際上我們寫代碼并不需要背下這個,我們完全可以通過多加幾個括號解決問題。但是考試它并不會管這些,考試是別人出的題,所以代碼也是它的。而我們也需要一個較高的分數,那么我們應該怎么辦呢?
沒錯,這篇博客就是為了這個而誕生的。從cggwz個人的刷題經歷,總結出易錯的一些點,提醒大家在考試中注意,那么廢話不多說,我們開始吧!
(再強調一遍:這里大部分是出卷人可能的設誤點,而不一定是你自己寫代碼的易錯點)

運算符相關

自增(減)前后綴

我們以自增為例,前綴和后綴的差別有兩點:

  • 優先級不同,后綴優先級更高

  • 返回值不同

  • 雖說優先級不同,但是在兩者之間也就邏輯非和按位取反,貌似不會有太大影響。
    而重點是返回值,也就是說,++x返回的是x+1,而x++返回的是原來的x。
    而x本身的值都會在返回值以后立刻改變,也就是執行這個表達式后立即改變,比如:

    #include
    int main(){
    int x=0,y=2,z=1;
    x=z++ + z;
    printf("%d",x);
    return 0;
    }

    這個輸出結果就是3,而不是2.

    邏輯運算符的短路問題

    C語言在計算邏輯運算符的時候是采取短路機制的,也就是說,如果已經可以判斷這個表達式的最終結果,那么就不再判斷接下來的表達式,相應地,那些表達式也不會被執行。而出題人則喜歡通過放置一些賦值語句在后面,某些學生會因為忽略了短路機制,而誤以為會執行,從而出錯,我們看個例子:

    #include
    int main(){
    int x=3,y=2,z=1;
    y=--z&&--x;
    printf("%d",x);
    return 0;
    }

    這里輸出是2嗎?
    并不是,是3.
    因為--z返回的值是0,而后面的邏輯運算符是&&,也就是說無論后面一個語句真假與否,這個表達式都是假,所以就會觸發短路機制,不再計算后面的++x,從而x的值不會改變。
    我們來看個變式:

    #include
    int main(){
    int x=3,y=2,z=1;
    y=--z&&--x||--x;
    printf("%d",x);
    return 0;
    }

    相信你現在應該能知道結果了,輸出就是2.中間的那個–x并不會因為它在中間而被執行。

    賦值運算符的返回值問題

    我們知道C語言中的賦值運算符是有返回值的。
    它們的返回值是賦值后被賦值變量的值,而不是賦值符號右邊的表達式的值
    比如int a=10;a+=3;這里的+=返回的就不是3,而是13.
    這也適用于類型轉換問題,比如double a;a=2;這里這個賦值語句的返回值就是2.0,而不是2.

    運算符優先級的問題

    考試前必須要掌握的內容之一。
    但是顯然,我這里不會把一大張表放出來,要是需要看看課本就好了。
    這里我是想總結一下這張表,讓大家更容易的“記住”這張表。
    我們也會順帶地總結一下結合方向。
    現在請翻開你的教材或是百度找到一張表,我們準備開車了。
    首先第一梯隊,優先級最高的,是一些指代所屬關系的運算符,比如[]、->、.。在加上一個圓括號。這個應該很好理解。圓括號如同一個老大哥,它在改變運算順序這方面具有絕對的話語權,自然會在第一梯隊,而這個老大哥也是懂人情的,->、.這類符號就好像是調用父對象里的一個子對象,把人家父子關系拆散恐怕不是一個老大哥應該做的,所以它們也屬于第一梯隊。
    它們的優先級是最高的。
    接下來第二梯隊主要是我們的單目運算符。比如正負號、指針符號、取地址、自加自減之類。它們通常是緊緊貼著它們作用的對象的(單目),那關系親密地如同情侶。雖然狗糧不好吃,但是不能因為嫉妒就拆散人家呀(誰說的,我就覺得可以),所以它們的優先級也是比較高的,屬于第二梯隊。
    第三梯隊就是我們的四大金剛啦——加減乘除,哦不,我們不能忘了我們除法的好兄弟——取余。所以它們五個就是我們的第三梯隊,我們可以把它們叫做算術運算符。這五大金剛可是從小學就開始陪伴我們了,自然在考慮完父子情、情侶情之后要考慮它們幾個了。
    第四梯隊是位運算的左移和右移運算符。這兩個家伙雖然名氣沒有上面五大金剛大,但是它們也是可以改變變量的值呢,也可以算得上小金剛了。所以,第四梯隊,當之無愧。
    第五梯隊是關系運算符,也就是表示大于小于不等這類符號。它們雖然也很早就開始陪伴我們,名氣也不小,但是畢竟是比較運算的結果,自然要等前兩個梯隊運算完,才能比較,那就只好屈居它們后面啦。
    第六梯隊是位運算的按位與、或、異或。理論上它們也是改變數值的呀,為什么不在前面的梯隊呢?我們可以看看它們的樣子:&、|,正好是我們下面一個梯隊的一半,二者的關系情同手足,成功固然美好,但是一份兄弟情,哪是成功可以換來的?它們自然愿意留在兄弟身旁,相依相助。
    第七梯隊是邏輯運算符,加上唯一一個三目運算符——條件運算符。它們連接的多半是關系運算符的結果,自然就得在關系運算符后面啦!
    第八梯隊可是一個大部隊,賦值運算符。它們當然得殿后啦,它們可是把前面的運算結果保存下來的必經之路。它們就如同慈愛的父母,默默地收拾前面這些孩子算出來的各種數據,并把它們認真地保存下來。我們的父母在我們小時候,不也是這樣的嗎?
    咦?我們好像還漏一個,沒錯,逗號運算符。存在感太低啦!就放在最后一個吧!(我想你們大部分人也很少用它)。
    這樣我們的優先級就徹底理清楚啦!
    總結一下:
    分量、下標運算符、圓括號>單目運算符>算數運算符(五大金剛加兩個小金剛)>關系運算符>位運算符(與或異或)>邏輯運算符(含條件運算符)>賦值運算符>逗號運算符
    這個總結并不嚴謹,因為有些運算符并不是在一起的,所以要注意對我說的故事的理解,再結合表看看背背就OK了。
    下面再說一下結合方向。
    這個還是很好總結的,除了后綴自加自減的所有單目運算符、條件運算符、賦值運算符是右結合,其他的符號全是左結合。
    這個還是很好理解的,那些單目運算符通常寫在作用對象的左邊,自然是從右向左結合,賦值符號也是把右邊的數值賦給左邊,所以也是從右向左,條件運算符……這么特殊的一個,記一下就好了。
    這樣我們就成功地解決了這張令人頭疼的表。怎么樣?不困難吧?

    sizeof()的返回值問題

    首先強調一下,這個不是函數,雖然它看起來很像。
    它運算得到的值是括號內的東西所占的內存大小,它是一個int型的值。所以sizeof()的表達式是int型表達式。

    函數相關

    函數聲明問題

    我們知道C語言里是需要函數聲明的,如果函數放在主調函數的后面,就需要在主調函數前進行原型聲明。
    但是不知道有沒有像我一樣,由于長期把函數放在主調函數的前面(少打幾行字),而在考試時容易忘記聲明這件事。其實網上有不少信息學競賽題的代碼,它們絕大多數都是把函數放在主調函數前面,所以這里也算是一個提醒吧。

    mian函數參數問題

    我們知道main函數有三個參數argc,argv,envp
    我們主要提示一下前面兩個。
    現在如果我們在命令行執行如下語句:

    D:\cgg.exe how are you!

    這么執行后,argv是4,而不是3,因為D:\cgg.exe也是一個參數,而它就保存在argv[0]中。
    這一點千萬不能忘記。

    變量相關

    用字符串初始化字符數組

    主要是長度的問題,我們知道C中的字符串是以一個空字符作為字符串的結尾標志。所以,我們在賦值時,要注意字符數組的長度要比字符串的長度多1。比如下面這段代碼是無法通過編譯的:

    #include
    int main(){
    char a[4]="abcd";
    return 0;
    }

    而我們只需要把a的長度改為5就好了。

    賦初值問題

    這是一個老生常談的問題,但是還是很容易被忽略。所以在這里再說一下。當遇到一些計算求值類的題,一定要注意把變量初始化,賦初值,比如0.

    轉義字符問題

    我們知道C語言中是有轉義字符的。轉義字符以\開頭,所以,我們是不能在一對單引號中間直接放置右斜杠的,還有就是注意,斜杠后如果是十六進制的表示碼,開頭是x或X,而不是0x或0X

    常用ASCII碼記憶

    常用的無非是大小寫字母和數字,這時一定需要記住的(除非你是上機考試)。

    字符ASCII值
    A65
    a97
    048
    CR(回車)13
    空格32

    字符串常量占用內存問題

    我們知道C中的字符串一定是以空字符‘\0’結尾,而這個空字符是不顯示的。所以有的出題老師會在這里設坑,比如:"abcde"占的內存大小是多少字節?雖然是五個字符,但是實際上還有一個空字符,總共是6字節。

    字符變量值的問題

    我們經常會遇到這樣的題,問你某個字符的值是什么。
    這時我們需要尤其小心,尤其是選擇題。
    我們舉個例子來說:char a='C'
    a的值是什么?
    是C嗎?
    如果你說是,那就錯了。
    我們只能說a的值是‘C’或者67.
    想必你應該能明白我想說什么了。
    單引號是不能省去的,這一點尤其重要,缺少了單引號,它就不再是一個字符了。
    這一點很容易忽略,尤其是選擇題,看到C這個選項,一激動就選上了。那就慘了。

    變量類型的范圍計算問題

    這里只提醒一點,計算范圍的時候不要忘記對于有符號的數,有一位符號位。

    字符串常量拼接問題

    在C語言中是允許進行字符串拼接的。
    也就是說,如果兩對引號包含的字符串放在一起,則會被解釋成一個字符串。
    比如:

    #include
    int main(){
    char a[15]="hello""world";
    char b[15]="hel""lo""world";
    printf("%s",b);
    return 0;
    }

    這兩個字符串都是合法的,且和“helloworld”等價。

    數組相關

    數組下標越界

    這個……恐怕是個程序員都會出過的bug,從你初學編程語言到你退休。
    考試也可能會出現這個問題,多半是在for循環里出現。

    二維數組中行列計算問題

    我們可能會經常看到這樣的題,就是另一個指針等于二維數組中的某個地址單元,然后對指針進行加一之類的操作,然后問輸出的值。
    而我們知道這里會有兩種不同的效果,一種是行計算,一種是列計算,二者的含義是,行計算,每次加一,地址會移動一行;而列計算,每次加一,地址只會移動一格。
    比如:

    #include
    int main(int argc,char *argv[]){
    char a[3][4]={{"you"},{"I"},{"we"}};
    char (*p)[4];
    p=a;
    printf("%s",*(p+1));
    return 0;
    }

    這里輸出的就是第二個字符串I
    具體的分類為:

    類型計算方式
    a計算行
    &a[0][0]計算列
    a[0]計算列
    *a計算列

    字符數組賦值問題

    我們知道我們可以這樣聲明一個字符數組:

    char a[12]="helloworld!";

    但是,字符數組在被定義之后,是不被允許這樣直接賦值的
    比如下面這段代碼是不會通過編譯的:

    char a[12];

    a="helloworld!";

    結構體相關

    結構體所包含的變量不可初始化

    這一點在C++中是被允許的,但是C中是不允許的。
    所以習慣了寫C++的同學尤其需要注意。
    不要忘記了。

    查看結構體內部變量所占內存大小

    這里我們只舉個例子,比如我們有ABC這個結構體,它有變量x,
    則sizeof(((struct ABC*)0)->x)得到的就是x占用的內存大小。
    這里的0,只要是int型的量就可以。

    庫函數相關

    絕對值函數

    注意math.h中有兩個絕對值函數,一個是abs(),另一個是fabs()
    其中前者是處理整型變量的,而后者是處理浮點型變量的

    scanf()和printf()的返回值問題

    我們通常會把它們當作輸入輸出語句使用,單獨成行,總是自動忽略它們的返回值,但其實它們是有返回值的。
    那么它們的返回值是什么呢?
    printf的返回值是輸出的數據個數,而scanf的返回值則是讀入的數據個數。
    我們可以來看個例題:

    #include
    int main(){
    int x;
    printf("2:%d",printf("1:%d,",scanf("%d",&x)));
    return 0;

    }

    請問它的輸出結果是什么?
    答案是
    1:1,2:4
    為什么是4?不知道你是不是想這么問。
    printf中所說的數據個數,其實是把輸出的每個字符都看成一個單獨的數據,也就是有多少字符加上我們傳入的數據,就是它的返回值。

    fclose()的返回值問題

    和scanf、printf一樣,我們經常忽略fclose的返回值,其實他也是有返回值的。
    如果成功關閉流,那么返回0,如果未成功關閉則返回-1。

    預編譯相關

    注意宏定義的替換原則

    我們知道宏定義實際上只是字符串的替換,并不是函數一樣的東西,所以我們在做題時也需要嚴格替換,替換完成之前,不要進行任何計算。
    我們舉個例子:

    答案是多少?54?那就錯了。實際上應該是48.
    這里我們不能把5+1算出來6再帶入,而是直接代入,這樣你就會發現,5和1不是直接加在一起的。

    免責聲明:本文系網絡轉載,版權歸原作者所有。如涉及作品版權問題,請我聯系,感謝!

    往期推薦好文

    ★C語言編程工具的選擇?

    ★求1000以內的水仙花數

    ★i++和++i有什么區別?

    ★「建議收藏」C語言編程判斷回文數

    ★看完你就明白:什么情況下該用int main(int argc, char *argv[])而不是int ????main(void)

    ★C語言編程:打印一個圓形

    ★福利:50本C語言電子書免費送了!

    ★C語言編程求解:1到1000之間所有的素數

    ★[必讀]C語言學習者常見問題及回答

    總結

    以上是生活随笔為你收集整理的asin c语言中 返回值范围_大学C语言考试易错知识点总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。