⑴ 求下列c語言試題詳解
為啥自己不調試一下呢?
都不是太難的題
你既然考這個
你自己就應該利用時間學學
最簡單的辦法就是你自己把這些程序調試一遍
一個結果一個結果的調
不會的再問
⑵ c語言常用的關鍵字試題及解析
額,這個不難吧 常用的 關鍵字
C語言關鍵字解析
C語言關鍵字有32個,如表1所示。雖然簡單,但還是讓一些初學者犯錯,譬如sizeof,好多初學者都認為是函數,其中包括我的一些同學,他們學過有好多年了,如此看來,有時我們追求高深的內容,往往會忽略基礎的簡單的內容!
表1 C語言標準定義的 32個關鍵字
關鍵字 意義
auto 聲明自動變數,預設時編譯器一般默認為 auto
int 聲明整型變數
double 聲明雙精度變數
long 聲明長整型變數
char 聲明字元型變數
float 聲明浮點型變數
short 聲明短整型變數
signed 聲明有符號類型變數
unsigned 聲明無符號類型變數
struct 聲明結構體變數
union 聲明聯合數據類型
enum 聲明枚舉類型
static 聲明靜態變數
switch 用於開關語句
case 開關語句分支
default 開關語句中的「其他」分支
break 跳出當前循環
register 聲明寄存器變數
const 聲明只讀變數
volatile 說明變數在程序執行中可被隱含地改變
typedef 用以給數據類型取別名(當然還有其他作用)
extern 聲明變數是在其他文件正聲明(也可以看
return 子程序返回語句(可以帶參數,也可不帶
void 聲明函數無返回值或無參數,聲明空類
continue 結束當前循環,開始下一輪循環
do 循環語句的循環體
while 循環語句的循環條件
if 條件語句
else 條件語句否定分支(與 if 連用)
for 一種循環語句(可意會不可言傳)
goto 無條件跳轉語句
sizeof 計算對象所佔內存空間大小
在這里我們也不一一講解每個關鍵字,只是講講比較容易被人忽略的或者易出錯的關鍵字說明一下。
在講之前,先說明一下,定義和聲明的區別:
定義:編譯器在創建一個對象時,為該對象申請開辟的內存空間,這個空間的的名字就是變數名或者對象名。同一個變數名在摸個區域內只能定義一次,重復定義會出現錯誤的。
聲明:有兩種作用,
1. 告訴編譯器,這個變數或者函數,我已經定義了(開辟空間了),但是在別的地方,我先說明一下,免得編譯器報錯。當然,聲明可以多次出現。
2. 告訴編譯器,這個變數名或者對象名,我先預定了,其他地方不可以用了。和在飯館吃飯(人多)要提前預約一樣的道理。
定義和聲明最本質的區別在於,聲明沒開辟空間,而定義則創建對象(變數)並開辟了空間。這是最重要的一點。
一. auto,register,extern,static,四種關鍵字
C語言說明變數的時,同時給出了兩個方面的信息:數據類型和存儲類。C語言中提供了存儲說明符auto,register,extern,static說明的四種存儲類別。
1. auto 是變數是C語言最常用的。編譯器在默認的預設情況下,所有變數都是auto的。對於函數的形參,也是auto型的。
2. extern, 語言中存在這樣的一種變數,在一個函數中合法出現的同時,又可以在其他的函數中合法出現,這就是外部變數。它的生命周期是整個程序的執行周期。
3. register,寄存器變數,其值存放在寄存器中,訪問速度快。有最快的關鍵字的稱呼。雖然寄存器的速度非常快,但是使用 register修飾符也有些限制的:register變數必須是能被 CPU寄存器所接受的類型。意味著 register變數必須是一個單個的值,並且其長度應小於或等於整型的長度。而且register變數可能不存放在內存中, 所以不能用取址運算符 「&」來獲取 register變數的地址。
4. static 靜態變數,兩個作用。第一個作用:修飾變數,都存在內存的靜態區。
靜態局部變數:出現在函數體內,生命周期是整個程序的執行過程,由於被 static修飾的變數總是存在內存的靜態區,即使該函數生命結束,其值不會被銷毀,同樣要修改該變數,就要到函數內部完成,所以用起來比較安全,起到信息屏蔽的作用。
靜態全局變數:出現在函數體外,作用域僅限於變數被定義的文件中,其他文件即使用 extern聲明也沒法使用他。
第二個作用,修飾函數,函數前加 static使得函數成為靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的作用域僅局限於本文件(所以又稱內部函數)。使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。
二. 基本數據類型----short、int、 long、char、float、double
這些關鍵字都是基本的數據類型,每種類型占據的內存空間不一樣,其實每種類型相當於一個模型,再通俗點就是一個模子。具體佔多少個位元組,可以用關鍵字sizeof去測一下。另外就就是存儲問題。不論是float還是double在存儲方式上都遵從IEEE的規范,float遵從的是IEEE R32.24 ,而double 遵從的是R64.53。
#include <stdio.h>
int main()
{
float a=999.999;
float b=0.005;
printf("%lf/n",a+b-1000.004);
return 0;
}
看看得到的結果並不是0,按數學計算本來應該是0,但由於浮點數的存儲有微小的誤差從而導致計算結果不是0
double m=3.3;
cout<<m;
你輸入3.3,再調試監測m的值你會發現存儲的是3.2999999999999998,而不是3.3.這就是本來是3.3而經過存儲卻變的不是3.3.
對計算機來說,實數是不存在的東西。一般,計算機除了認識「整數」——這個整數和數學中的整數也不是一個東西。
還認識的一種數就是「浮點數」——和數學中的實數更是兩碼事。
三.最冤枉的關鍵字sizeof
經常被我們當成函數來使用,雖然造型很像函數,其實是關鍵字,
int i=0;
A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i;
以上四種寫法都是正確的,結果為4.可以在VC6.0編譯器watch窗口下觀察,前兩種寫法很常見,但後面的也正確。從c和d正確可以排除sizeof是函數的說法,當然我們在使用的時候還是加上括弧,披著函數皮的關鍵字吧!
請看下面的例子:
struct Test
{ int Num;
char*Pc;
short sDtate;
char ch[2];
short S[4];
}*p;
那麼這個結構體的大小多少呢?他與共同體的區別很明顯,共同體所有成員變數都共用同一塊內存,而結構體每個元素都佔用相應地內存。
共同體的最大的成員所佔內存為共同體佔用內存。
int:佔4個位元組(32系統)。
char*pc:4個:指針相當於地址,地址就是你當前操作系統的位數。如果是指針數組即存放指針的數組,佔用的空間是4*數組的個數。
如果是數組指針即指向數組的指針,指針指向的是數組的地址,佔用4個位元組。
short sDtate:2個
char ch[2]:2個
short S[4]:2*4=8 short型數組
所以一起:4+4+2+2+8=20位元組。VC下驗證是正確的,不要以為這樣就沒事了,其實還是有問題的:位元組對齊的問題。
struct S1
{
char c;
int i;
};
S1 s1={'a',0xFFFFFFFF};
問sizeof(s1)等於多少?char佔1個位元組,int佔4個位元組,那麼加起來就應該是5。這樣算對嗎?VC6中按默認設置得到的結果卻是為8。
我們來好好琢磨一下sizeof的定義——sizeof的結果等於對象或者類型所佔的內存位元組數,好吧,那就讓我們來看看S1的內存分配情況:
以我的VC6.0為例,s1的地址為0x0012FF74,使用memory窗口觀察,其數據內容如下:
0012FF74: 61 CC CC CC FF FF FF FF
你會發現中間夾雜了3個位元組的CC?看看MSDN上的說明:
When applied to a structure type or variable, sizeof returns the actual size,which may include padding bytes inserted for alignment.
原來如此,這就是傳說中的位元組對齊啊!那麼為什麼需要位元組對齊?計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令周期了。各個硬體平台對存儲空間的處理上有很大的不同。一些平台對某些特定類型的數據只能從某些特定地址開始存取。其他平台可能沒有這種情況, 但是最常見的是如果不按照適合其平台的要求對數據存放進行對齊,會在存取效率上帶來損失。這也是空間和時間的博弈。
⑶ C語言試題
二維數組 9個元素 分別是 a[0][0] ,a[0][1],a[0][2],a[1][0],a[1][1],a[1][2],a[2][0],a[2][1],a[2][2],
p=&a[0] [0] ;// p指向數組 即 元素a[0][0]。
for (i=o ; i<9; i++ ) p[i ] = i+1 ; //這里p[i] 將 二維數組當做一維看 ,其實二維不過是人為定義 ,在內存中,還是順序存儲,
循環依次賦值 p[0] = 1 ,其實就是a[0][0] =1
p[1] = a[0][1] = 2
p[2] = a[0][2] = 3
p[3] = a[1][0] = 4
p[4] = a[1][1] = 5
p[5] = a[1][2] = 6 //這就是答案
。。。
p[8] = a[2][2] = 9
⑷ 歷年計算機二級c語言考試的試題及詳解
歷年試題及詳解推薦你買本《未來教育·全國計算機等級考試上機考試、全真筆試、歷年真題三合一二級C》看看,裡面的試題基本上都是考試的原題,講解解析也非常好,裡面的軟體環境也基本是考試的軟體環境,挺棒的,推薦樓主看看
⑸ c語言測試題目及答案
B.因為在計算1/2時參與運算的分子分母都是整型,將會得到整型數據0而不是浮點型數據0.5,而其他選項在做除法時,參與計算的分子或分母至少一方是float型,可以得到正確結果
⑹ C語言試題解答
我運行了一下,是一個*
原因很簡單:雙重循環因分號而進行了數次空循環
待循環結束後,進入輸出語句-printf('x')
所以只輸出了一個星號
嵌套式是由內而外的,最內層的分號將導致所有外層執行一樣的行為
你可以試試將分號打在第一層循環後面,這時第二句循環便起作用了
其實這里的分號相當於{}
你在平時寫程序的時候,分號多是起結束作用,不是嗎?這里也是
你看看這個程序,效果是一樣的
#include<iostream>
intmain()
{
inti,k;
for(i=0;i<4;i++,i++)
for(k=1;k<3;k++)
{
}
printf("*");
return0;
}
希望對你有所幫助
⑺ c語言試題
a<b<c,首先執行a<b,由於1<2,所以返回值為1(因為判斷運算返回值只有0和1),然後a<b<c就變為1<c,比較結果為1,執行循環里的操作。執行之後,a=2,b=1,c=1。再判斷跟上面的一樣,不用細說。 所以執行結果是1,2,0.
⑻ C語言試題解答
1、選擇B。 15.後邊不能有"," 6,000中間不能有",", 1010B是二進制數,一般沒人這么寫。
2、選擇A。變數命必須是字元、數字、下劃線的組合,並且必須要字母、下劃線開頭。A中的int和_int連在一起寫了,應該分開。
3、選擇A。注意賦值語句的左邊必須是變數。D的強制類型轉換的"()"必須用在類型上,正確的應該是(double)x/10
4、選擇D。其他的沒有正解。
5、選擇B。C中f還沒有初始值,是不能參加計算的。
D賦值常量沒有這么寫的。
6、選擇D。條件判斷不能像數學那樣連寫,應該分開,比如:k>=f && f>=m
7、選擇C。常量不能進行自加自減操作。
---------------------------------------------
>>1 B 2 D 5 B A為什麼不對啊
1、選擇B沒有問題,上邊已經給你分析原因了。
2、選擇A也沒有問題,我覺得答案給錯完了,你在編譯器器上試一下不就知道了嗎。
5、選擇B、因為n1=n2;這條語句必須要在n2有初值的條件下才成立。
>>++(i+1);為什麼是常量啊
因為i加1了,所以i+1這個值是常量,常量是不能在進行++、--操作的。
如果直接是i++、++i那就沒有問題了。
⑼ c語言試題
#include <stdio.h>
int main()
{
int num,x;
x=0;
num=0;
while(num<10)
{
while(x%3!=2||x%5!=4||x%7!=3)
{
x=x+1;
}
printf("%d\n",x);
num=num++;
x++;
}
}
錯在x%4!=4 ,漏了個x++
另外你可以用數學方法證明,每個符合條件的數,相差105(3*5*7)。效率會提高很多
#include <stdio.h>
int main()
{
int num, x;
x = 0;
num = 0;
while(num < 10)
{
while(x%3 != 2 || x%5 != 4 || x%7 != 3)
{
x = x + 1;
}
printf("%d\n", x);
num++;
while(num < 10)
{
x += 105;
printf("%d\n", x);
num++;
}
}
}
⑽ C語言試題。
a=2的值為2,非0即為真,b=-2的值為-2,非0即為真
兩項相與,則為真,真假在c語言中用整數表示的話真為1,假為0
另外對於負值語句,只要負的值不是0邏輯結果都為真