當前位置:首頁 » 編程語言 » c語言不明白
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言不明白

發布時間: 2022-02-26 06:29:56

Ⅰ 為什麼c語言我看不明白

老是看到有些朋友發帖子:

感覺對於學習c語言無從下手,特別是剛入門的朋友.看到那些奇怪的,不合常理的符號,感覺完全是摸不著路一樣.

然後寫這篇帖子,談一下個人的學習方法和學習效率,希望對大家有幫助,特別是新手,

書的選擇

首先選擇一本或者兩本,開始學習的時候,書不要過多,多了自己看不完,而且每一本書,作者都有自己的思路和寫法習慣,然後現在市面上的書很多編寫都不是很好,紕漏百出.看的多了反而感覺思維太混.一些印刷的錯誤或者其作者本來就寫的不正確的程序,對於初學者或者是不懂的朋友,要花許多的時間把錯誤找出來.很是麻煩.我以前發的教材是北郵出版的,c語言程序設計.基本上教材上面的例子,就算照抄的話,3個就有2個要出現錯誤.上機課的時候,大家都不怎麼會,就把例子抄下來.出了錯,不能夠通過編譯,就不停的問老師.白白浪費了許多時間.

我感覺現在編寫書的許多作者,在編寫的時候,遇到些簡單的程序,隨手一寫,然後就印刷上了書,也沒經過調試得到正確的結果.最後出現了些許錯誤.也不管三七二十一,只要書能賣的好,就行了.這是相當不負責任的.誤導讀者.

開始學習,可以看看潭浩強的c程序設計,老潭的書賣得好,還是有他的理由的,錯誤比較少,然後講的也比較通俗易懂,清華出的書我感覺都還可以.

習慣和方法

貴在堅持,每天看.一天不要搞懂很多的問題,但求把看過的一部分的每一個環節搞清楚,實在搞不清楚的,先跳過去,學習逐漸深入,看了後面在看前面,前後的知識是相通相連的.

我一般都會把書上的例子一個一個的敲到計算機上面,然後調試,運行.不要看過了就以為自己懂了,那是不好的,就算讓你看100編,你輸入到機器裡面,還是可能會出錯,一個簡單的

main()

{ printf("hello world.") }

你就算這樣背了下來,還是出錯,因為你沒有注意到語句少了分號,為什麼這里有一個分號.只有自己把代碼輸入,機器編譯通順了,你才明白自己錯在那裡.當敲的代碼越來越多,熟練度越高,編譯再次出現錯誤,就知道錯在那裡.如何更正.還有一個好處就是可以發現一些錯誤,這些錯誤涉及到當前沒有學習過的知識.然後通過逐漸深入的學習,在回想以前出錯的,就知道當時為什麼會出錯.把這里改成

main()

{ print("hello world");}編譯系統會報出不同的錯誤結果

比如這個函數沒有寫頭文件,在某寫c++的編譯器中也不能通過,當你學習過c++的一些相關知識以後,你就會逐漸明白其中的道理.為什麼要使用頭文件等等.

錯誤是相當重要的,書上只會告訴你怎麼寫一個對的程序,程序的格式,程序怎麼寫.不會告訴你出了錯誤怎麼修正,如何處理,靠自己不斷的摸索,才會有新的心得和體會.

把課後的習題做完,做好,基本上都弄懂,習題是檢驗你這一章學習怎麼樣的一個標准.自己想,自己做,寫出簡單的演算法,不懂的,上論壇,上c吧,發帖子,會有人告訴你的,

不要拿著書上的練習跑到論壇來求代碼,這是不好的,也沒有人願意告訴你.誰都願意幫助那些自己思考的朋友,不願意幫助像乞丐一樣不勞動就指望人家給你代碼寫好了把作業交差了事或者是只為了應付考試矇混過關的人.那樣的人不是真正的喜歡編程,不指望提高自己的水平,也不需要我們幫助.

學習後面的知識的時候,如果遇到以前的問題,再把掌握的代碼敲一遍,敲兩遍,敲n遍提高熟練度,更加可以發現新的問題.

mian()

{
int a = 5;
printf("%d",a);
}

誰都知道輸出5,把程序改從一小處

mian()

{
int a = 5;
printf("%d");
}

程序是通不過編譯呢,還是輸出奇怪的字元或者地址.相信有部分朋友不知道.(我也不知道)

3不斷深入

有如許多朋友發帖子說的,經常把一些時髦的語言掛到嘴邊,比如說我要學c#好,還是,java好,不如把基礎的東西弄懂弄通.在我看來,在沒有學習好c 之前最好不要學習其他任何的語言,不要想到c#,java裡面沒有指針,沒有復雜的東西,可以避難就易,基礎的東西不學好,就像做的很華麗的豆腐渣工程,再漂亮,也是會倒的.學完了c ,學習數據結構,學完了,學習計算機編譯原理,當你把這三門課都掌握的時候,再開始學習c++,c#,或者是java就很容易,也快得多,

把平時用的多的演算法寫下來,記住,把基礎的學好以後,不斷往後的學習,你會發現,知道的東西越多,不知道的東西越多,軟體行業的博大精深,任何一個小的領域,比如c ,也許窮盡我門畢生的精力才發現自己錯學只不過是邊陲一角.

因為我自己的學習也在初學階段徘徊,所以也不知道應該更加深入的學習的方法,但是相信知識積累到一定的程度.你自然就知道自己往哪方面發展.

Ⅱ C語言看不懂

對於第一個的一大堆的if條件語句,只能逐個的使用play_state的值去與後面的比較,當然要遵守&&運算符的短路規則,也就是對於a&&b,如果a的值為0,那麼就不用去判斷b是多少了,因為不管b是多少,對於&&運算符來說與0的運算其結果都為0。
至於你說的找不到play_state的值,play_state這個值,如果是在其他函數中或者if語句中定義的,那麼這個值可以不用看,因為這個值是局部變數,局部變數一但離開定義他的語句塊或者函數,其值將不會存在,而且在語句塊或函數外的程序是看不到局部變數的。因此對於play_state的值,你應該查找,是不是定義了一個全局變數,應找到全局變數的值才是有效的值。
至於邏輯預處理指令#if,其實這個語句就與C中的if語句是一樣的,如果#if後面的條件成立,則執行後面的語句,否則就跳出。並不是像你所說#ifdef語句,是否後面沒有定義就不用看了,應該判斷後面的條件是否成立。一般#if語句是與#define連合使用的,下面給你介紹一下#if語句。
邏輯預處理器指令:
1、邏輯#if指令:該指令原理與條件語句if相同,如果測試為真就執行後面的語句,如果為假則跳過後面的語句。該指令有兩種用法,其一可以用#if指令測試某個符號以前是否用#define指令定義過,這是最常用的用法,其二可以用來測試某個條件表達式是否為真。
2、#if指令用法一:測試某個符號是否以前用#define定義過,該用法的指令如下#if
defined
標識符
….
#endif
其縮寫形式為#ifdef
標識符….#endif表示如果,指定的標識符已被#define定義,則中間的語句就包含在源文件中,如果該標識符還未被#define定義,則跳過#if和#endif之間的語句,該語句以#endif結束,還要注意的是標識符前的關見字是defined比define多一個字母d。
3、測試標識符是否不存在:其語法為#if
!defined
標識符…..#endif縮寫形式為#ifnedf
標識符…..#endif表示如果指定的標識符沒有定義,則把#if和#endif之間的語句包含在源文件中,如果標識符已定義則跳過#if和#endif之間的代碼,實標上#ifndef語句比#ifdef語句使用得更頻繁,因為系統使用該語句防止頭文件被多次包含,
4、防止頭文件被包含多次的方:其方法為#ifndef
HY
#define
HY語句#endif程序在開始遇到標識符HY時沒有被定義,這時執行後面的語句,再第二次被使用時則標識符HY已經被定義,這時不會執行後面的語句,從而防止了同一頭文件被包含多次的情況。這里要注意使用#define後面定義的標識符不需要值。
5、#if語句還可以使用邏輯運算符以測試多個值,比如#if
defined
HY1&&HY2….#endif當HY1與HY2都為真時才執行,同樣還可以使用其他邏輯運算符。
6、#if指令用法二:測試某個表達式的值是否為真,其語法格式為:#if
常量表達式….#endif,注意常量表達式的求值結果應是整數常量表達式,比如#if
a=2
….
#endif測試a的值是否為2,如果為2則執行#if與#endif之間的語句。
4.7、多個#if選擇塊:和常規的if語句一樣#if也有對應的#else和#elif語句,比如#if
a=3
….
#else
….
#endif表示如果a=3則執行if後面且在#else前面的語句,如果為假則執行#else與#endif間的語句。#elif用來實現多個選擇,該語句和常規語句的else
if相似,比如#if
a=1
….
#elif
a=2
….
#elif
a=3….
#else
….
#endif表示,如果a=1則執行#if後的語句,如果a=2則執行該條件後的語句。
執行開始後,按順序先執行x=0;,因為它不在循環體內,所以只執行1次,
接下來是個循環嵌套,外層循環的for(i=1;i<n;i++)語句要執行n次,(因為要進行n次判斷),內層循環要執行n+(n-1)+(n-2)+...+1次,用等差數列求和公式表示這個和,就是n(n+1)/2次

Ⅲ C語言 新手 不明白

#include是文件包含命令,作用:可以將另—個C源程序的全部內容包含進來,其形式為:#include <文件名>或#include "文件名"
通常可以把經常用到的,帶公用性的一些函數或符號等集合在一起形成一個源文件,然後用此命令將這個源文件包含進來,這樣可以避免在每個新程序中都要重新鍵入這些內容。

.h是頭文件的意思.

stdio.h是標准輸入輸出頭文件!包含這個文件可以使用庫中提供的標准輸入輸出函數.

.h可以換成別的,但一般若是公用的函數都寫成頭文件的形式放在一起.

Ⅳ c語言程序,不明白

sure.
1.定義共用體變數w:
union un
{ int a;
char c[2];
}w;
在變數w中,有兩個成員a 和 c共用一塊空間,通常,a(int型)佔4個位元組,c(char)數組佔了兩個位元組;
2.下面的賦值語句:
w.c[0]='A';w.c[1]='a';
由於a 和 c共用一塊空間,這樣同時也把'A'和'a'賦給了變數a,
'A'的值是0x41,'a'的值是0x61,'a'在高位,『A』在低位,因此變數a的值是:0x6141,8進製表示是:60501
3.因此,在列印語句中8進制的輸出中,
printf("%o\n",w.a);
輸出為:60501
4.getchar();是個等待用戶輸入以結束程序運行用的。

Ⅳ C語言的幾個不明白

1.printf("%d,%d,%d,%d\n",i,j,++i,j++)後面是逗號表達式,從右往左算,即:j++ ++i j i
2.弄清=是賦值,把右邊變數的值給左邊的變數,==是比較,判斷左右的值是否相等,相等算作1,不相等算作0
3.知道ASCII碼表吧,你把a保存在計算機中時,實際存的是97這個數,因為計算機是2進制,只能存數……
4.空循環很少吧,我沒用過,這個例子不知道恰當不:
for(i=0; i<n; i++);/*將i加到n的大小*/
5.定義僅在他所在的語句塊內有效
{
int x=6;
......
}
這個x只在兩個{ }之間有效
6.所佔位數指這個類型的變數保存在計算機時,占的內存大小。位 也是個大小單位,像MB,GB一樣。取值范圍的理解是對的。
int和short為什麼相等,這個在C標准沒明確規定,只說int不能小於short,所以各種編譯器上,有int等於short的,也有int比short大的,一般教材以TC為准,說int和short一樣

初學,如錯,請斧正

Ⅵ c語言,一個語句不明白,詳細給解釋下

fun(s,&t),調用了上面定義的函數,傳入的參數分別為數組s,t的地址, s數組名表示數組的首地址,所以不用再取地址,只需要把數組的首地址傳過去就行了,c語言中數組的地址是連續的,指針的本質也是地址, 而t只是一個整型變數,不是一個地址,函數的兩個參數都為指針也就是地址,所以需要把t的地址傳過去

Ⅶ C語言,不明白

第一個程序
c=a;=a=b;b=c;
\
=a=b

出錯
還有
你把p=&x,p=&y;
這是你的本意么?
應該
是p=&x,q=&y;才是你的本意吧
呵呵
~~
如果是
p=&x,q=&y
那第一個程序應該是:
先看
1.
#include
"stdio.h"
void
fun(int
*a,int
*b)
{
int
*c;
c=a;a=b;b=c;
\
2.
所以a,b就是&x,&y,c=a;a=b;b=c;
這句話的意
思就是把a,b里放的地址交換,則a指向了y,b指向了x;
printf("%d%d",*a,*b);
\則列印出來的值是
5
3(看下面3.)
}
main()
int
*p,*q;
{int
x=3,y=5,p=&x,q=&y;
\
1.
此時你把p,q分別指向了x,y地址
\也是就是p,q放著x,y的地址
fun(p,q);printf("%d%d",*p,*q);
\函數fun傳遞了p,q
(看上面
2.)
\3.
fun調用完後,列印*p,*q值是
3,5!!
驚~!為什麼沒交換?是不是,
很疑惑啊,看下面解釋。
fun
(&x,&y);printf("%d%d",*p,*q);
}
看這個函數:
#include
void
fun(x,y)
{
int
c;
c=x;x=y;y=c;
}
main()
{
int
x=3,y=5;
fun();
printf("\n
%d
%d
",x,y);
}
輸出還是3
5
為什麼fun里x,y沒交換,原因你可能很清楚
因為fun()x,y並不是main()里的x,y,他是在fun在另外申請兩個地址來
存放3
和5的,所以fun()里x,y交換後的值與main()x,y里是不相關的;
還有c語言呢,規定只能實參給形參傳遞值,而反之不行,所以main里的x,y不交換。
現在回來說,
*a,
*b和*p,*q,開始
*p,*q,傳遞地址給*a,*b,
則p
a,
q
b,指向同一個地址,但是
p,q,和
a,b,
所在的地址確不一樣
a,b,
是另外申請地址的(上面說到了),指針也是有地址的(不理解課可以看下書,指針那章),所以p
a,
q
b,雖指向同一個數但是他們卻不同,c=a;=a=b;b=c;這句的只是把a,b里指向的地址交換(也就是a->y,b->x),
不關p,q事,p
,q還是指向原來的x,y.所以
輸出5,3,3,5,5,3,3,5;
第二個程序:
它跟第一個函數有什麼區別,區別就在這里*c=*a;*a=*b;*b=*c;
雖然p
a,
q
b不是同一個數,但是他們分別指向了同一個地址&x,&y;
*c=*a;*a=*b;*b=*c;就是讓x,y的值交換,既然x,y得值都換了,那*p和*q
的值能不變么?
自己畫個圖,很好理解的~!

Ⅷ C語言選擇,不明白

形參是你函數聲明時用的參數名。

實參是你使用函數時用的參數名。

#include<stdio.h>

intadd(inta,intb);

intmain()
{
intx=1,y=2;
intz=add(x,y);//x,y為實際參數,分別對應形參a,b.
printf("z:%d ",z);
printf("a:%d ",x);//x,y實參值沒有改變
printf("b:%d ",y);
return0;
}

intadd(inta,intb)//a,b是形式參數
{
intc=a+b;
a=a+1;//對形參進行運算,沒有改變實參的值
b=b+1;
returnc;
}

Ⅸ c語言題目不明白

十六進制的3就是十進制的3,也就是二進制11。
unsigned char是八位(一位元組),0x3表示出來就是 00000011。

Ⅹ C語言中不明白的一個問題!

不同的系統,有不同的編譯器,不同的c語言環境,也有不同的編譯器

編譯器不需要很大的靈活性,windows上面的編譯器,只需要它編譯出來的東西,能在window上允許就OK了

它又不會去考慮能否在手機上運行

確實,c的編譯器都不是很大!