那是因為你沒有理解scanf_s的用法,_s是safe,即安全的意思,那麼如何保證安全呢,當這個函數試圖讀取c或者s時,需要為它傳遞緩沖區最大長度,因為我們只讀取1字元,所以要傳1,
正確調用如下:
scanf_s("%lf%c%lf", &first_number, &character, 1, &second_numble);
注意加粗的1,表示只讀取1個長度的緩沖區,並存儲在character變數里
內存異常訪問的原因是你的調用沒有傳這個1,相當於少了一個參數,那麼最後一個參數即second_numble的地址是一個錯亂的值,導致了內存訪問錯誤。
同理,scanf_s("%c", &command_begin);的調用也是錯誤的,需要加一個參數1
其實這些都是有警告的,大概你忽略掉了。
⑵ java教程與c語言教程沖突嗎有聯系嗎
沒有沖突的,可以同時學,因為C++是從C語言誕生而來,java又是從C++誕生而來,所以是有很大聯系的,當然,經過這么久的發展,各個語言已經各有特色了,但是最好還是學完一個再學一個,這樣學的會比較深入
希望我的回答對您有所幫助!
⑶ c語言 寫入位置時發生訪問沖突是怎麼回事兒
c語言 寫入位置時發生訪問沖突是設置錯誤造成的,解決方法為:
1、用VS2013打開程序。
⑷ c語言中發生沖突訪問
scanf_s改成scanf
或者
scanf_s("%f%c%f",&a,&c,1,&b);
輸入公式的時候,數值與運算符中間加空格。
如果不想這樣,就要修改代碼,把公式當一個字元串來輸入,代碼中再來提取運算值和運算符,再進行計算即可。
有一種代碼可以將這種中綴表達式轉為後綴表達式,再進行計算,可以計算比這復雜的多的公式,比如可以計算帶括弧的復雜公式。
⑸ C語言 讀取位置 發生沖突
沒有仔細看代碼,懷疑是內存泄露或指針使用的問題,建議單步跟蹤測試,以確定故障點。
⑹ c語言調試中斷,說沖突
for(i=0;i<10;i++)
{
if(a[i]>t)
{
for(j=9;j<=i;j--)a[j+1]=a[j];//你的循環終止條件有問題
}
else a[10]=t;
}
printf("the true is");
for(i=0;i<11;i++)printf(" %d ",a[i]);
}
⑺ C語言 數據結構中解決沖突的方法是什麼
可以參考如下方法:
1 基本原理
使用一個下標范圍比較大的數組來存儲元素。可以設計一個函數(哈希函數, 也叫做散列函數),使得每個元素的關鍵字都與一個函數值(即數組下標)相對應,於是用這個數組單元來存儲這個元素;也可以簡單的理解為,按照關鍵字為每一個元素"分類",然後將這個元素存儲在相應"類"所對應的地方。
但是,不能夠保證每個元素的關鍵字與函數值是一一對應的,因此極有可能出現對於不同的元素,卻計算出了相同的函數值,這樣就產生了"沖突",換句話說,就是把不同的元素分在了相同的"類"之中。後面我們將看到一種解決"沖突"的簡便做法。
總的來說,"直接定址"與"解決沖突"是哈希表的兩大特點。
2 函數構造
構造函數的常用方法(下面為了敘述簡潔,設 h(k) 表示關鍵字為 k 的元素所對應的函數值):
a) 除余法:
選擇一個適當的正整數 p ,令 h(k ) = k mod p
這里, p 如果選取的是比較大的素數,效果比較好。而且此法非常容易實現,因此是最常用的方法。
b) 數字選擇法:
如果關鍵字的位數比較多,超過長整型範圍而無法直接運算,可以選擇其中數字分布比較均勻的若干位,所組成的新的值作為關鍵字或者直接作為函數值。
3 沖突處理
線性重新散列技術易於實現且可以較好的達到目的。令數組元素個數為 S ,則當 h(k) 已經存儲了元素的時候,依次探查 (h(k)+i) mod S , i=1,2,3…… ,直到找到空的存儲單元為止(或者從頭到尾掃描一圈仍未發現空單元,這就是哈希表已經滿了,發生了錯誤。當然這是可以通過擴大數組范圍避免的)。
4 支持運算
哈希表支持的運算主要有:初始化(makenull)、哈希函數值的運算(h(x))、插入元素(insert)、查找元素(member)。
設插入的元素的關鍵字為 x ,A 為存儲的數組。
初始化比較容易,例如
const empty=maxlongint; // 用非常大的整數代表這個位置沒有存儲元素
p=9997; // 表的大小
procere makenull;
var i:integer;
begin
for i:=0 to p-1 do
A[i]:=empty;
End;
哈希函數值的運算根據函數的不同而變化,例如除余法的一個例子:
function h(x:longint):Integer;
begin
h:= x mod p;
end;
我們注意到,插入和查找首先都需要對這個元素定位,即如果這個元素若存在,它應該存儲在什麼位置,因此加入一個定位的函數 locate
function locate(x:longint):integer;
var orig,i:integer;
begin
orig:=h(x);
i:=0;
while (i<S)and(A[(orig+i)mod S]<>x)and(A[(orig+i)mod S]<>empty) do
inc(i);
//當這個循環停下來時,要麼找到一個空的存儲單元,要麼找到這個元
//素存儲的單元,要麼表已經滿了
locate:=(orig+i) mod S;
end;
插入元素
procere insert(x:longint);
var posi:integer;
begin
posi:=locate(x); //定位函數的返回值
if A[posi]=empty then A[posi]:=x
else error; //error 即為發生了錯誤,當然這是可以避免的
end;
查找元素是否已經在表中
procere member(x:longint):boolean;
var posi:integer;
begin
posi:=locate(x);
if A[posi]=x then member:=true
else member:=false;
end;
這些就是建立在哈希表上的常用基本運算。
4.1 應用的簡單原則
什麼時候適合應用哈希表呢?如果發現解決這個問題時經常要詢問:"某個元素是否在已知集合中?",也就是需要高效的數據存儲和查找,則使用哈希表是最好不過的了!那麼,在應用哈希表的過程中,值得注意的是什麼呢?
哈希函數的設計很重要。一個不好的哈希函數,就是指造成很多沖突的情況,從前面的例子已經可以看出來,解決沖突會浪費掉大量時間,因此我們的目標就是盡力避免沖突。前面提到,在使用"除余法"的時候,h(k)=k mod p ,p 最好是一個大素數。這就是為了盡力避免沖突。為什麼呢?假設 p=1000 ,則哈希函數分類的標准實際上就變成了按照末三位數分類,這樣最多1000類,沖突會很多。一般地說,如果 p 的約數越多,那麼沖突的幾率就越大。
簡單的證明:假設 p 是一個有較多約數的數,同時在數據中存在 q 滿足 gcd(p,q)=d >1 ,即有 p=a*d , q=b*d, 則有 q mod p= q - p* [q div p] =q - p*[b div a] . ① 其中 [b div a ] 的取值范圍是不會超過 [0,b] 的正整數。也就是說, [b div a] 的值只有 b+1 種可能,而 p 是一個預先確定的數。因此 ① 式的值就只有 b+1 種可能了。這樣,雖然mod 運算之後的余數仍然在 [0,p-1] 內,但是它的取值僅限於 ① 可能取到的那些值。也就是說余數的分布變得不均勻了。容易看出, p 的約數越多,發生這種余數分布不均勻的情況就越頻繁,沖突的幾率越高。而素數的約數是最少的,因此我們選用大素數。記住"素數是我們的得力助手"。
另一方面,一味的追求低沖突率也不好。理論上,是可以設計出一個幾乎完美,幾乎沒有沖突的函數的。然而,這樣做顯然不值得,因為這樣的函數設計很浪費時間而且編碼一定很復雜,與其花費這么大的精力去設計函數,還不如用一個雖然沖突多一些但是編碼簡單的函數。因此,函數還需要易於編碼,即易於實現。
綜上所述,設計一個好的哈希函數是很關鍵的。而"好"的標准,就是較低的沖突率和易於實現。
⑻ c語言訪問內存沖突,這該怎麼辦啊
、C中內存分為四個區
棧:用來存放函數的形參和函數內的局部變數。由編譯器分配空間,在函數執行完後由編譯器自動釋放。
堆:用來存放由動態分配函數(如malloc)分配的空間。是由程序員自己手動分配的,並且必須由程序員使用free釋放。如果忘記用free釋放,會導致所分配的空間一直占著不放,導致內存泄露。
全局局:用來存放全局變數和靜態變數。存在於程序的整個運行期間,是由編譯器分配和釋放的。
文字常量區:例如char *c = 「123456」;則」123456」為文字常量,存放於文字常量區。也由編譯器控制分配和釋放。
程序代碼區:用來存放程序的二進制代碼。
例子(一)
int a = 0; //全局區
void main()
{
int b; //棧
char s[] = abc; //s在棧,abc在文字常量區
char *p1,*p2; //棧
char *p3 = 123456; //123456在常量區,p3在棧上
static int c =0; //全局區
p1 = (char *)malloc(10); //p1在棧,分配的10位元組在堆
p2 = (char *)malloc(20); //p2在棧,分配的20位元組在堆
strcpy(p1, 123456); //123456放在常量區
}
例子(二)
//返回char型指針
char *f()
{
//s數組存放於棧上
char s[4] = {'1','2','3','0'};
return s; //返回s數組的地址,但程序運行完s數組就被釋放了
}
void main()
{
char *s;
s = f();
printf (%s, s); //列印出來亂碼。因為s所指向地址已經沒有數據
}
2、動態分配釋放內存
用malloc動態分配內存後一定要判斷一下分配是否成功,判斷指針的值是否為NULL。
內存分配成功後要對內存單元進行初始化。
內存分配成功且初始化後使用時別越界了。
內存使用完後要用free(p)釋放,注意,釋放後,p的值是不會變的,仍然是一個地址值,仍然指向那塊內存區,只是這塊內存區的值變成垃圾了。為了防止後面繼續使用這塊內存,應在free(p)後,立即p=NULL,這樣後面如果要使用,判斷p是否為NULL時就會判斷出來。
NO.1
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str,hello world);
printf(str);
}
請問運行Test函數後會是什麼樣的結果?
NO.2
char *GetMemory(void)
{
char p[] = hello world;
retrun p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
問題同NO.1
NO.3
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str,100);
strcpy(str,hello);
printf(str);
}
問題同NO.1
NO.4
void Test(void)
{
char *str = (char *)malloc(100);
strcpy(str,hello);
free(str);
if(str != NULL)
{
strcpy(str,world);
printf(str);
}
}
問題同NO.1
我對以上問題的分析:
NO.1:程序首先申請一個char類型的指針str,並把str指向NULL(即str里存的是NULL的地址,*str為NULL中的值為0),調用函數的過程中做了如下動作:1申請一個char 類型的指針p,2把str的內容到了p里(這是參數傳遞過程中系統所做的),3為p指針申請了100個空間,4返回Test函數.最後程序把字元串hello world拷貝到str指向的內存空間里.到這里錯誤出現了!str的空間始終為NULL而並沒有實際的空間.深刻理解函數調用的第2步,將不難發現問題所在!(建議:畫圖理解)
NO.2:程序首先申請一個char類型的指針str,並把str指向NULL.調用函數的過程中做了如下動作:1申請一數組p[]並將其賦值為hello world(數組的空間大小為12),2返回數組名p付給str指針(即返回了數組的首地址).那麼這樣就可以列印出字元串"hello world"了么?當然是不能的!因為在函數調用的時候漏掉了最後一步.也就是在第2步return數組名後,函數調用還要進行一步操作,也就是釋放內存空間.當一個函數被調用結束後它會釋放掉它裡面所有的變數所佔用的空間.所以數組空間被釋放掉了,也就是說str所指向的內容將不確定是什麼東西.
NO.3:正確答案為可以列印出hello.但內存泄漏了!
NO.4:申請空間,拷貝字元串,釋放空間.前三步操作都沒有任何問題.到if語句里的判斷條件開始出錯了,因為一個指針被釋放之後其內容並不是NULL,而是一個不確定的值.所以if語句永遠都不能被執行.這也是著名的"野"指針問題.所以我們在編寫程序釋放一個指針之後一定要人為的將指針付成NULL.這樣就會避免出現"野"指針的出現.有人說"野"指針很可怕,會帶來意想不到的錯誤.
C語言內存對齊
C99規定int、unsigned int和bool可以作為位域類型,但編譯器幾乎都對此作了擴展,允許其它類型類型的存在。
使用位域的主要目的是壓縮存儲,其大致規則為:
1) 如果相鄰位域欄位的類型相同,且其位寬之和小於類型的sizeof大小,則後面的欄位將緊鄰前一個欄位存儲,直到不能容納為止;
2) 如果相鄰位域欄位的類型相同,但其位寬之和大於類型的sizeof大小,則後面的欄位將從新的存儲單元開始,其偏移量為其類型大小的整數倍;
3) 如果相鄰的位域欄位的類型不同,則各編譯器的具體實現有差異,VC6採取不壓縮方式,Dev-C++採取壓縮方式;
4) 如果位域欄位之間穿插著非位域欄位,則不進行壓縮;
5) 整個結構體的總大小為最寬基本類型成員大小的整數倍。
還是讓我們來看看例子。
示例1:
struct BF1
{
char f1 : 3;
char f2 : 4;
char f3 : 5;
};
其內存布局為:
|_f1__|__f2__|_|____f3___|____|
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
0 3 7 8 1316
位域類型為char,第1個位元組僅能容納下f1和f2,所以f2被壓縮到第1個位元組中,而f3隻能從下一個位元組開始。因此sizeof(BF1)的結果為2。
示例2:
struct BF2
{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
由於相鄰位域類型不同,在VC6中其sizeof為6,在Dev-C++中為2。
示例3:
struct BF3
{
char f1 : 3;
char f2;
char f3 : 5;
};
什麼是內存對齊
考慮下面的結構:
struct foo
{
char c1;
short s;
char c2;
int i;
};
假設這個結構的成員在內存中是緊湊排列的,假設c1的地址是0,那麼s的地址就應該是1,c2的地址就是3,i的地址就是4。也就是
c1 00000000, s 00000001, c2 00000003, i 00000004。
可是,我們在Visual c/c++ 6中寫一個簡單的程序:
struct foo a;
printf("c1 %p, s %p, c2 %p, i %p/n",
(unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.s - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.i - (unsigned int)(void*)&a);
運行,輸出:
c1 00000000, s 00000002, c2 00000004, i 00000008。
為什麼會這樣?這就是內存對齊而導致的問題。
為什麼會有內存對齊
以下內容節選自《Intel Architecture 32 Manual》。
字,雙字,和四字在自然邊界上不需要在內存中對齊。(對字,雙字,和四字來說,自然邊界分別是偶數地址,可以被4整除的地址,和可以被8整除的地址。)
無論如何,為了提高程序的性能,數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的內存,處理器需要作兩次內存訪問;然而,對齊的內存訪問僅需要一次訪問。
一個字或雙字操作數跨越了4位元組邊界,或者一個四字操作數跨越了8位元組邊界,被認為是未對齊的,從而需要兩次匯流排周期來訪問內存。一個字起始地址是奇數但卻沒有跨越字邊界被認為是對齊的,能夠在一個匯流排周期中被訪問。
某些操作雙四字的指令需要內存操作數在自然邊界上對齊。如果操作數沒有對齊,這些指令將會產生一個通用保護異常(#GP)。雙四字的自然邊界是能夠被16整除的地址。其他的操作雙四字的指令允許未對齊的訪問(不會產生通用保護異常),然而,需要額外的內存匯流排周期來訪問內存中未對齊的數據。
編譯器對內存對齊的處理
預設情況下,c/c++編譯器默認將結構、棧中的成員數據進行內存對齊。因此,上面的程序輸出就變成了:
c1 00000000, s 00000002, c2 00000004, i 00000008。
編譯器將未對齊的成員向後移,將每一個都成員對齊到自然邊界上,從而也導致了整個結構的尺寸變大。盡管會犧牲一點空間(成員之間有空洞),但提高了性能。
也正是這個原因,我們不可以斷言sizeof(foo) == 8。在這個例子中,sizeof(foo) == 12。
如何避免內存對齊的影響
那麼,能不能既達到提高性能的目的,又能節約一點空間呢?有一點小技巧可以使用。比如我們可以將上面的結構改成:
struct bar
{
char c1;
char c2;
short s;
int i;
};
這樣一來,每個成員都對齊在其自然邊界上,從而避免了編譯器自動對齊。在這個例子中,sizeof(bar) == 8。
這個技巧有一個重要的作用,尤其是這個結構作為API的一部分提供給第三方開發使用的時候。第三方開發者可能將編譯器的默認對齊選項改變,從而造成這個結構在你的發行的DLL中使用某種對齊方式,而在第三方開發者哪裡卻使用另外一種對齊方式。這將會導致重大問題。
比如,foo結構,我們的DLL使用默認對齊選項,對齊為
c1 00000000, s 00000002, c2 00000004, i 00000008,同時sizeof(foo) == 12。
而第三方將對齊選項關閉,導致
c1 00000000, s 00000001, c2 00000003, i 00000004,同時sizeof(foo) == 8。
如何使用c/c++中的對齊選項
vc6中的編譯選項有 /Zp[1|2|4|8|16] ,/Zp1表示以1位元組邊界對齊,相應的,/Zpn表示以n位元組邊界對齊。n位元組邊界對齊的意思是說,一個成員的地址必須安排在成員的尺寸的整數倍地址上或者是n的整數倍地址上,取它們中的最小值。也就是:
min ( sizeof ( member ), n)
實際上,1位元組邊界對齊也就表示了結構成員之間沒有空洞。
/Zpn選項是應用於整個工程的,影響所有的參與編譯的結構。
要使用這個選項,可以在vc6中打開工程屬性頁,c/c++頁,選擇Code Generation分類,在Struct member alignment可以選擇。
要專門針對某些結構定義使用對齊選項,可以使用#pragma pack編譯指令。指令語法如下:
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
意義和/Zpn選項相同。比如:
#pragma pack(1)
struct foo_pack
{
char c1;
short s;
char c2;
int i;
};
#pragma pack()
棧內存對齊
我們可以觀察到,在vc6中棧的對齊方式不受結構成員對齊選項的影響。(本來就是兩碼事)。它總是保持對齊,而且對齊在4位元組邊界上。
驗證代碼
#include <stdio.h>
struct foo
{
char c1;
short s;
char c2;
int i;
};
struct bar
{
char c1;
char c2;
short s;
int i;
};
#pragma pack(1)
struct foo_pack
{
char c1;
short s;
char c2;
int i;
};
#pragma pack()
int main(int argc, char* argv[])
{
char c1;
short s;
char c2;
int i;
struct foo a;
struct bar b;
struct foo_pack p;
printf("stack c1 %p, s %p, c2 %p, i %p/n",
(unsigned int)(void*)&c1 - (unsigned int)(void*)&i,
(unsigned int)(void*)&s - (unsigned int)(void*)&i,
(unsigned int)(void*)&c2 - (unsigned int)(void*)&i,
(unsigned int)(void*)&i - (unsigned int)(void*)&i);
printf("struct foo c1 %p, s %p, c2 %p, i %p/n",
(unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.s - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.i - (unsigned int)(void*)&a);
printf("struct bar c1 %p, c2 %p, s %p, i %p/n",
(unsigned int)(void*)&b.c1 - (unsigned int)(void*)&b,
(unsigned int)(void*)&b.c2 - (unsigned int)(void*)&b,
(unsigned int)(void*)&b.s - (unsigned int)(void*)&b,
(unsigned int)(void*)&b.i - (unsigned int)(void*)&b);
printf("struct foo_pack c1 %p, s %p, c2 %p, i %p/n",
(unsigned int)(void*)&p.c1 - (unsigned int)(void*)&p,
(unsigned int)(void*)&p.s - (unsigned int)(void*)&p,
(unsigned int)(void*)&p.c2 - (unsigned int)(void*)&p,
(unsigned int)(void*)&p.i - (unsigned int)(void*)&p);
printf("sizeof foo is %d/n", sizeof(foo));
printf("sizeof bar is %d/n", sizeof(bar));
printf("sizeof foo_pack is %d/n", sizeof(foo_pack));
return 0;
}
⑼ c語言相關的幾個問題
這些人回答的都很好,你仔細仔細再仔細的看下吧
回答者: dixnuits - 大魔法師 八級 2009-5-9 21:49
1.不過時,不會過時,如果過時了其他語言也過時了,c語言是基礎,其他很多語言都是基於c語言開發的
2.肯定合適
3.c是面向過程的,c++是面向對象的。
回答者: znzhang - 門吏 三級 2009-5-9 21:50
1.沒有。不會。除非人們不再用計算機編程。只要還在用計算機,就會有人用C語言編程的,雖然現在大部分人認為面向對象的JAVA或者其它的比C語言容易上手的,可是如果你學過了C語言,再去學其它的軟體,就會發現有了C語言的基礎,學什麼都很簡單的。但是如果你先學了其它的編程語言,再學C語言,發現C語言還是很基礎的,它比一般的匯編要容易懂些,比面向對象的又相對簡單,屬於介面類型、承上啟下,是不可多得的語言。
2.適合。現在大學里依然開的是C語言,用的依然是譚浩強的《C程序設計》,況且現在的二級還是以C語言作為考試內容。想要學習好語言,必需從基礎的開始學起,所以從最基本的C語言開始是最適合不過了。不過要想學好它,必需要有耐心才行。
3. C是面向過程的程序設計語言。C++是面向對象的程序設計語言,不過C++語言保持了對C語言的兼容,也就說是在C++程序可以不用修改的插入C語言代碼。不過最開始還是C語言適合入門。
回答者: 小馬232 - 大魔法師 九級 2009-5-9 21:54
首先聲明下 我也在學C語言 從C中感到樂趣 就像現在在網路知道回答問題 並不是為了那麼點分數,我也要看題目,一旦遇到自己會作出來的,絕對不會再做,看到模稜兩可的會拿出來做做,現在越來越對C感興趣,下面回答你的問題,聲明只是個人建議
1.C語言永遠不會過時,它是所有編程的基礎,著種演算法,可以變成很多的程序,但是有一定的局限性,所有有了C++
2.完全可以的,C語言是基礎,學好了C,學其他的語言就簡單了,不過要有很大的耐心的,因為做程序設計的很累的
3.C是演算法著重過程,而c++是面向對象的,兩者不沖突,沒有C也可以學C++,c可以編才程序c++也可以編
回答者: chenlg1102 - 初入江湖 二級 2009-5-9 21:57
1.c語言是最為基礎的語言,可以說永遠不會過時,而且現在的應用面非常之廣,c語言在驅動,硬體方面有著不可動搖的地位.作為一個程序員,你可以不會Java,C#,但不可以不會C.
2.看看現在大學安排的課程就知道了,C語言基本都是第一學期就開的
3.C是一個結構化語言,如譚老爺子所說:它的重點在於演算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制),而對於C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取對象的狀態信息得到輸出或實現過程(事務)控制。
所以C與C++的最大區別在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為" 設計這個概念已經被融入到C++之中 ",而就語言本身而言,在C中更多的是演算法的概念。那麼是不是C就不重要了,錯!演算法是程序設計的基礎,好的設計如果沒有好的演算法,一樣不行。而且,"C加上好的設計"也能寫出非常好的東西。
對語言本身而言,C是C++的子集,那麼是什麼樣的一個子集?從上文可以看出, C實現了C++中過程化控制及其它相關功能,而在C++中的C(我稱它為"C+"),相對於原來的C還有所加強,引入了重載、內聯函數、異常處理等等玩藝兒,C++更是拓展了面向對象設計的內容,如類、繼承、虛函數、模板和包容器類等等。
再提高一點,在C++中,數據封裝、類型這些東東已不是什麼新鮮事了,需要考慮的是諸如:對象粒度的選擇、對象介面的設計和繼承、組合與繼承的使用等等問題。
所以相對於C,C++包含了更豐富的"設計"的概念,但C是C++的一個自洽子集,也具有強大的功能,同樣值得學習。
回答者: imabeau - 助理 三級 2009-5-9 21:57
1. 在操作系統、 比較底層的編程、 嵌入式 等方面,除了C語言幾乎沒有其它選擇。 所以相當長時間內不可能過時
2. 隨便,哪種語言都有的學。 當然javascript之類的就別當回事了。。
3. 從本意上說,C++是C語言的面向對象的擴充。 但擴充的結果是失去了一些C語言原有的優勢和特點, 所以所謂「C++是更好的C」 或者「C++是面向對象的C」這種幻想已經是破滅了。 現實情況是,在使用方向上C++和C語言已經分道揚鑣, C++的優勢在大型軟體的快速開發
回答者: vbtraz - 高級魔法師 七級 2009-5-9 21:58
1.C沒過時,也不會過時,C可以直接和硬體打交道,別的高級語言都做不到,所以別寫操作系統就用它.
2.學C把,誰然C的現實用處不多,但是它是讓你學個習慣,打基礎的語言。
3.C++和C沒關系的,發明C++的人 建議我們直接學C++
回答者: ijlynietg - 同進士出身 六級 2009-5-9 22:44
1.c語言過時了嗎?回過時嗎?如果會那什麼時候回過時?如果不會 為什麼?
絕對不會過時。因為涉及底層的開發c還是非常優秀的
2.可以,程序書寫上還是多參考規范,c語言不夠嚴謹
3.c++是c的超集,更靈活,在大規模程序上更易維護,但也註定了它與底層的結合不是很好
回答者: wanfustudio - 副總裁 十級 2009-5-9 22:55
1,c語言在本世紀還不會過時,c語言是比較基礎的語言
2,最好從匯編開始,很多病毒,高級的程序都是匯編程序,
3,我同意c++是c語言的拓充(我是先學的C,c++幾乎包含所有的C的內容)
回答者: chengjie_ - 江湖新秀 四級 2009-5-10 00:18
說實話,你的問題根本沒人可以完整回答,再資深的人也不可能決定你的前途。
首先說過時問題,何謂「過時」,好,就算有你說的「過時」,那C不會是在世界各地一齊過時吧,總得慢慢過時吧。
其次適合從哪裡學,得看你想以後做什麼,也就是說得有個前提。
最後說區別,很多,多的我都羅列不出來,就算羅列出來了,你也未必看的明白,就算你最後費勁看明白了,那也估計你自己學的也差不多了,所以我就甭費勁復制粘貼了。
重要的是要抓緊一切時間開始做,問切實的問題,做的多了,自然就明白了,其實就那麼點事,不要把別人說的看成是自己的。
回答者: 可咸 - 舉人 四級 2009-5-10 00:20
我哥哥是駐日本軟體工程師。天天逼著我學C 這不1個多月了 還真學了不少東西
C是基礎 就像1+1 ,沒C C++學起來就很困難 學了C C++就容易多了
回答者: 遇見′伏筆 - 試用期 一級 2009-5-10 00:57
C語言 不會過時的...可以把他當做一種基礎來學習,你學習了他 再去學習別的語言如C++ 就會容易 好多...
我們就是學的C語言 C++ 可以看做C的拓展。C++支持面向對象功能的程序設計語言,而C語言是面向過程的程序設計語言,它不但具有C語言的短小精練,使用方便的特點,還在原來的基礎上,使類型更嚴格,使用更方便。C++面向對象 C面向過程 。
我覺得 可以 從C開始學起,這樣你學別的語言就會更容易了。
雖然語言不一樣,只是換個單詞 ,實際一個意思的。
有用的東西 怎麼可能過時啊 是吧? 加油! 還有匯編語言等你學呢,嘿嘿..不過好難哦!希望你是 這類語言的奇才...努力吧!
回答者: 管管的面面 - 初入江湖 二級 2009-5-10 10:05
樓主,你好!
1、C不會過時。。簡單說就是C是一種功能強大成熟的語言,小到單片機,大到幾何級計算機都用可以用它。。而且在低層操作的除匯編之外,基本上沒有比它更強的。。學C也是學其它語言的基礎。。
2、學習C可以學習它的演算法和數據結構。。這個是相當有用啊。。
3、C 和C++肯定有關系。。不是的話,那為什麼C++不叫P++,Q++什麼的。。C++的擴展名是cpp就是C Plus Plus的縮寫。。
C是面向過程。C++是面向對向。
回答者: 資州縱尋 - 大魔導師 十二級 2009-5-10 10:50
回答:1:C語言不會過時,因為他是簡單的入門語言程序,很普遍,新手必須學的,再高的手他也得會C語言。
回答:2:不一定,看個人愛好問題,但是有的東西也會涉及到C語言,你也可以從資料庫學起,CF,CB啦之類,沒有必須的開始位置。
回答:3:C語言也可以說是C++,但是版本不同一些命令和跳轉語言也不一樣,變化不太大,雖然方向不同,但是高點是一樣的。
回答者: ctksmq520 - 初入江湖 二級 2009-5-10 18:01
1.C語言沒過時,我不知道你是什麼專業的,但在我專業里要學單片機(一種晶元,廣泛用在日常生活和電子設備中,刷卡機,液晶顯示,讀卡器。。。等等中,只要你能看到的那些高級的設備都用到),就要求用C語言編程式控制制單片機實現功能的。不要以為C++等比他高級它就會過時,因為單片機高級語言只支持C語言。我參加全國的電子設計比賽,在產生正弦波,數模轉化,液晶顯示等方面,都用到單片機和C語言控制。全國電子設計大賽作為全國四大大學生比賽之一,學好單片機和C語言是必須的。你不要以為C語言只是用來做電腦軟體的,那樣的話是不實際的,C語言是用在硬體控制上。
2.如果你要學高級語言,我推薦你學C語言先,我現在都覺得C語言很實用,C語言的代碼比較易懂,當我學了C語言再學c++和java,就覺得這兩個只是在C上加了點東西。
3.C語言是面向過程的(注重過程的編寫),C++是面向對象的(把過程分類,包裝好,使用時直接調用),C語言就像製作的小零件,C++就像已經有了這些零件,把它組裝成大機器,所以說c++功能強大。
回答者: 12121237 - 舉人 四級 2009-5-11 16:23
可以的,任何一個開發語言都是獨立的
回答者: 豬兵團 - 經理 四級 2009-5-12 08:44
1、C語言是學習其他高級語言的基礎,所以不會過時
2、如果你是想學編程的,可以從c語言出發
3、如果你C語言學好了,學C++就會更容易,因為我現在就是在學計算機專業,第一個學期學的C語言,所以比較了解
還有什麼不懂留言給我吧,呵呵`!
回答者: feng_liu0621 - 試用期 一級 2009-5-12 21:01
1如果你是初學者的話 絕對不過時!然而一切事物都有始終 但必須要有新事物替代 如果某天出現用自然語言編程的話 那它就過時了。
2 你作為初學者 如果真的想學好計算機語言的話 從c語言開始那是理所當然的
3 c和c++其實如果學了c後那它則是c的拓展 沒學c則好像什麼都不是 建議你慢慢來 ……
回答者: 錦陽之戀 - 試用期 一級 2009-5-13 00:41
首先樓主我接觸C不到4個月,回答你這個問題不是為了拿分,只是不想樓主走彎路,C語言不會過時,當今很多人都在用C語言,因為C語言屬於中高級語言,接近底層.當然匯編是另一種難以理解的語言,一個計算機愛好者可以看看C語言,了解數據結構,了解CPU,了解操作系統是最好不過的了.C語言和C++不相同,C語言用的是指針,而C++是面向對象,所以兩者關系很小,有人說學習了C,然後學習C++就很好學,那是因為你明白了語言之間的邏輯,語言具有共通性,就像漢語跟外語有共同的地方.希望能給樓主一些好的想法.
61952645這是學習C語言的群,我們有自己的論壇www.6dtm.com專門學習各類關於電腦知識的論壇,歡迎你去看看
回答者: 冰冰_濤 - 助理 三級 2009-5-13 18:13
1、加法過時了嗎? 所謂的過時是說你不能用它找到工作,但是編程初學者從它學起很好;
2、c與c++的區別,你學了自然有你自己的理解。
回答者: az12xc34 - 兵卒 一級 2009-5-13 18:44
1. C語言再過50年也不會過時,有些很底層(比如操作系統)很注重效率(比如關系資料庫)都必須拿C語言寫的,偶爾嵌點匯編。
2. C語言很適合入門,不過前提是要有必要的計算機體系架構的知識,畢竟C語言很貼近硬體層,完全不懂計算機硬體知識會很難理解一些概念比如指針。既然是愛好者,推薦看一些大學計算機組成原理課程的教材。
3. C語言跟C++,從語法上說C++是C的超級,或者說C++是幾乎完全兼容C的。但從開發理念上說,C++是面向對象,C語言是面向過程,可以說是分別代表了兩個時代!如果要刨根問底,建議閱讀《C++編程思想》,裡面詳細解釋了C++是怎樣在C的基礎上一步步發展起來的,C++的每個主要特性各是解決了C語言的哪些缺陷。
回答者: catmonkeyxu - 見習魔法師 二級 2009-5-14 09:49
要了解C與C++的不同首先要了解C與C++的發展史!
C是在B的基礎上發基礎上發展起來的。1972年至1973間,貝爾實驗室的D.M.Ritchie在B的基礎上設計出了C語言。C語言既保持了BCPL和B語言的優點(精練,接近硬體),又克服了它們的缺點(過於簡單,數據無類型等)。
C語言的優點: 1:語言簡單、緊湊,使用方便、靈活。 2:運算符豐富。 3:數據類型豐富,具有現代語言的各種結構。 4:有結構化的控制語句(if…else,while,for等)。 5:語法限制不太嚴格,程序設計自由度大。 6:可以直接對硬體操作。 7:生成目標代碼質量高,程序執行效率高。 8:可移值好!
C++是在C的基礎上發展起來的,所以C++對C具有兼容性,即用C寫的程序可以在C++上運行。就是因為C++對C具有兼容性所以C++在面向對象的設計語言中就失去了很多優勢。比如指針,在其他語言中(如Java)中是沒有的,C++兼容C所以一定要有的。C++是介於C與Java之間的過度語言,並不是完全的面向對象的語言。
再打個簡單的比喻來說明C與C++之間的關系。我們可以把C比作是自行車那麼C++就是電動自行車。自行車時速要是10千米每小時的話,那麼電動自行車就可以達到20千米每小時。也就是說C++比C具有更強的功能。再有就是我們完全可以按照騎自行車的辦法去騎電動自行車,這說明C++對C具有兼容性。再有就是電動自行車在沒有電的情況下完全可以按照騎自行車的方法去騎電動自行車。這一點說明了C++在C的基礎上發展而來的。
說了這多麼應該對C與C++有所了解了吧。希望對你學習有所幫助!
回答者: aimilin6688 - 助理 三級 2009-5-16 14:03
1.沒過時。不會過時。因為它可以直接對硬體進行操作。是其他語言無法完全代替的。
2.適合從C開始學。
3.c++是c語言的拓充不錯,但是C也有C++無法代替的地方有的
人認為C++ > C那會讓人笑掉大牙,不妨你去打聽一下,現在有幾個操作系統內核是用C++寫的,又有幾個實時系統用的是C++,當然我也不是說C++不好,但是目前的內核和實時系統中C++還無法與C匹敵,不過C++適合做應用系統的開發。所以我的觀點是不在於你用什麼語言,而在於你干什麼工作。你的設計體現了你的技術層次。
一個初學者可以從C學起,再學C++就簡單多了
回答者: cyj78117520 - 見習魔法師 二級 2009-5-17 10:38