1、一語句實現x是否爲2的若干次冪的判斷
1)int i = 512;
cout << boolalpha << ((i & (i - 1)) ? false : true) << endl; //位與爲0,則表示是2的若干次冪
2)return (x>>N==1);
2、請問以下代碼有什麼問題?
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
"AAA"是字符串常量。s是指針,指向這個字符串常量,
又因爲是常量區,所以對於s[0]的賦值操作是不合法的
。
3、寫一個“標準”宏,這個宏輸入兩個參數並返回較小的一個。
#define Min(X, Y) ((X)>(Y)?(Y):(X)) //結尾沒有;
4、交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之後a=5,b=3; 0
a = a + b;
b = a - b;
a = a - b;
或者
a = a^b;// 只能對int,char..
b = a^b;
a = a^b;
5、下面程序有問題嗎?
#include <stdio.h>
#include <stdlib.h>
void getmemory(char *p){
p=(char *) malloc(100);
}
int main( ){
char *str=NULL;
getmemory(str);
printf("%s/n",str);
free(str);
return 0;
}
6、進程之間通信的途徑
共享存儲系統
消息傳遞系統
管道:以文件系統爲基礎
7、下面這個程序執行後會有什麼錯誤或者效果。
#define MAX 255
int main(){
unsigned char A[MAX],i;
for (i=0;i<=MAX;i++)
A[i] = i;
}
MAX=255,數組A的下標範圍爲:0…MAX-1,這是其一,其二當i循環到255時,又循環內執行。
因爲A[255]=255;這句本身沒有問題,但是返回for (i=0;i<=MAX;i++)語句時,由於unsigned char的取值範圍在(0~255),i++以後i又爲0了,無限循環下去。
8、ASSERT()是幹什麼用的
ASSERT()是一個調試程序時經常使用的宏,在程序運行時它計算括號內的表達式,如果表達式爲FALSE (0),
程序將報告錯誤,並終止執行。如果表達式不爲0,則繼續執行後面的語句。這個宏通常原來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重後果,同時也便於查找錯誤。例如,變量n在程序中不應該爲0,如果爲0可能導致錯誤,你可以這樣寫程序:
......
ASSERT( n != 0);
k = 10/ n;
......
ASSERT只有在Debug版本中才有效,如果編譯爲Release版本則被忽略。assert()的功能類似,它是ANSI C標準中規定的函數,它與ASSERT的一個重要區別是可以用在Release版本中。
9、system("pause");作用?
系統的暫停程序,按任意鍵繼續,屏幕會打印“按任意鍵繼續……”
10、請講一講析構函數和虛函數的用法和作用?
析構函數也是特殊的類成員函數,它沒有返回類型,沒有參數,不能隨意調用,也沒有重載。只是在類對象生命期結束的時候,由系統自動調用釋放在構造函數中分配的資源。這種在運行時,能依據其類型確認調用那個函數的能力稱爲多態性,或稱遲後聯編。另:析構函數一般在對象撤消前做收尾工作,比如回收內存等工作。
虛擬函數的功能是使子類可以用同名的函數對父類函數進行覆蓋,並且在調用時自動調用子類覆蓋函數,如果是純虛函數,則純粹是爲了在子類覆蓋時有個統一的命名而已。
注意:子類重新定義父類的虛函數的做法叫覆蓋,override,而不是overload(重載),重載的概念不屬於面向對象編程,重載指的是存在多個同名函數,這些函數的參數表不同..重載是在編譯期間就決定了的,是靜態的,因此,重載與多態無關.與面向對象編程無關.
11、爲什麼標準頭文件都有類似以下的結構?
#ifndef __INCvxWorksh
#define __INCvxWorksh
……
#endif
防止被重複引用。
char* strcpy( char *strDest, const char *strSrc )
char* strcpy( char *strDest, const char *strSrc ){
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ );
return address;
}
http://blog.csdn.net/littlestream9527/article/details/8257630
13、分別給出BOOL,int,float,指針變量與“零值”比較的 if 語句(假設變量名爲var)並能清晰表達程序的意思。
http://www.cnblogs.com/zhangdongsheng/archive/2010/11/08/1871405.html
BOOL型變量:if(!var)
int型變量: if(var==0)
float型變量:
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
指針變量: if(var==NULL)
浮點型變量並不精確,所以不可將float變量用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”形式。
14、以下程序的輸出結果?
int main()
{
char a[7]= “ab\0cde\0”;
int i,j;
i=sizeof(a);
j=strlen(a);
printf(“%d%d\n”,i,j);
}
c語言中以‘\0’作爲字符串的結束符,且strlen()函數計算的是‘\0’字符前的所有字符的個數。數組定義以後系統就爲其分配相應大小的內存空間,而不論其中有沒有內容。
15、以下程序的輸出結果?
{
int a[3][3],*p,i;
p=&a[0][0];
for(i=0;i<9;i++)
p[i]=i+2;
printf(”%d\n”,a[2][1]);
}
輸出結果:9;
16、寫一個函數返回1+2+3+…+n的值(要求代碼儘量簡單、高效)
int Sum( int n ){
long sum = 0;
for( int i=1; i<=n; i++ ){
sum += i;}
return sum;
}
int Sum( int n ){
return ( (long)1 + n) * n / 2; //或return (1l + n) * n / 2;
}
所以程序員們需要敏感地將數學等知識用在程序設計中。
17、請寫一個C函數:若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1
int checkCPU(){
union w{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
http://blog.csdn.net/rtyytr/article/details/6703580
18、看看下面的一段程序有什麼錯誤?
如何修正?
swap( int* p1,int* p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
在swap函數中,p是一個“野”指針,有可能指向系統區,導致程序運行的崩潰。
19、分析下面一段程序有什麼錯誤?如何修正?
int main(int argc, char* argv[])
{
char *string = NULL;
char strdes[10];
char str[10];
int i;
for(i=0; i<10; i++){
str[i] = 'a';
}
string = strcpy(strdes, str);
printf("%s\n",string);
return 0;
}
20、函數編寫
編寫一個函數,作用是把一個char組成的字符串循環右移n個
。比如原來是“abcdefghi”如果n=2,移位後應該是“hiabcdefg”。提示:使用庫函數: strcpy()或者memcpy()。
21、嵌入式系統中經常要用到無限循環,你怎麼樣用C編寫死循環呢?
while(1)
{}
----------------------------------------------------------
for(;;)
{}
--------------------------------------
goto
Loop:
...
goto Loop;
22、#i nclude<filename.h> 和#i nclude “filename.h” 有什麼區別?
前者用來包含開發環境提供的庫頭文件,後者用來包含
自己編寫的頭文件。
23、在C++ 程序中調用被 C 編譯器編譯後的函數,爲什麼要加 extern “C”聲明?
函數和變量被C++編譯後在符號庫中的名字與C語言的不同,被extern "C"修飾的變量和函數是按照C語言方式編譯和連接的。由於編譯後的名字不同,C++程序不能直接調
用C 函數。C++提供了一個C 連接交換指定符號extern“C”來解決這個問題。
24、函數模板與類模板有什麼區別?
函數模板的實例化是由編譯程序在處理函數調用時自動完成的,而類模板的實例化必須由程序員在程序中顯式地指定。
25、編譯器自動對齊的原因?
爲了提高程序的性能,數據結構(尤其是棧)應該儘可能地在自然邊界上對齊。原因在於,爲了訪問未對齊的內存,處理器需要作兩次內存訪問;然而,對齊的內存訪問僅需要一次訪問。
26、引用與指針有什麼區別?
1) 引用必須被初始化,指針不必。
2) 引用初始化以後不能被改變,指針可以改變所指的對象。
3) 不存在指向空值的引用,但是存在指向空值的指針。
http://zhidao.baidu.com/question/4616759.html?qbl=relate_question_0&word
27、一個32位的機器,該機器的指針是多少位。
指針是多少位只要看地址總線的位數就行了。80386以後的機子都是32的數據總線(馮.諾依曼結構,地址總線和數據總線複用)。所以指針的位數就是4個字節了。
28、設n=10,i=4,則賦值運算
n%=i+1執行後n的值爲( )
A.0 B.1 C.2 D.3
29、設a,b爲整型數,且a=2,b=4,則表達式(a/b?b+a:b-a)的值爲:
A . 0.5 B. 6 C. 2 D. 此表達式錯誤
30、在中國東北有這樣兩個村落,趙村所有的村民都是白天祭祀祖先,而李莊的人都是晚上祭祀祖先,能肯定的沒人在白天和晚上都祭祀祖先的。我們也知道趙李明是晚上祭祀祖先的人,那麼以下哪個選項是正確的。
A.趙李明是趙村的人。
B.趙李明不是趙村的人。
C.趙李明是李莊的人。
D.趙李明不是李莊的人。
E.趙李明既不是趙村的人,也不是李莊的人
31、相傳在古時候某國的國民都分別居住在兩個怪城裏,一座“真城”,一座“假城”。凡真城的人個個都說真話,而假城的人個個都說假話。一位知道情況的外國遊客來到其中一個城市,他只問了一個問題就知道自己來到是哪個城了。猜猜他問了什麼問題?
你是這個城市的人嗎?
32、設“並非無奸不商”爲真,則下面哪個選項一定爲真。
A.所有商人都是奸商。
B.所有商人都不是奸商。
C.並非所有商人不是奸商。
D.並非所有商人是奸商。
E.有的商人不是奸商。
33、有一家人決定搬進城裏,於是去找房子。全家三口,夫妻兩個和一個5歲的孩子。通過廣告找到一家滿意的,於是就前去敲門詢問。但房東遺憾地說:“我們公寓不招有孩子的住戶。” 丈夫和妻子聽了,一時不知如何是好,於是,他們默默地走開了。
那5歲的孩子,把事情的經過從頭至尾都看在眼裏,又去敲房東的大門……房東聽了之後,高聲笑了起來,決定把房子租給他們住。
問:這位5歲的小孩子說了什麼話,終於說服了房東?