你可能不知道的程式設計小問題 程式基本概念

2021-06-21 14:00:25 字數 2558 閱讀 5229

面試題

一、下列c++**的輸出結果是什麼?

int i = 1;

void main()

a、mian裡面的i是乙個未定義值

b、main裡面的i的值為1

c、main裡面的i的值為0

d、編譯出錯

答案--a

解析--在c++中這樣做是完全合法的(但顯然不合理),int i = i, 後面的i是已經在main裡面宣告的i,而不是main外面的i(區域性變數覆蓋全域性變數),所以i只是未定義而已(隨機值)。

面試題二、下列兩段**輸出結果是什麼?

int a,x;

for (a=0,x=0;a<=1 && !x++;a++)

cout<

答案--第一段結果為21,第二段結果為12

解析--關於&&運算子,如果左邊的值為0,則右邊的運算元將棄之不管,||運算子也有類似道理

面試題三、下面**輸出結果是什麼?

int arr = ;

int* ptr = arr;

*(ptr++)+=123;

printf("%d,%d\n",*ptr,*(++ptr));

答案--8,8

解析--要注意執行完*(ptr++)+=123;後,ptr已經指向第二個元素,第二個要注意的就是輸出語句(printf、cout)的執行順序是從右到左,所以先執行*(++ptr),ptr指向第三個元素

面試題四、下面程式輸出結果是多少?

float a=1.0f;

cout<<(int)a<

答案--第一段**:1

106535216

false

第二段**:0

0 ture

解析--(int)a實際上是以浮點數a為引數構造了乙個整型數,該整數的值是1,(int&)a則是告訴編譯器將a當作整數看(

並沒有做任何實質上的轉換)。因為1以整數形式存放和以浮點形式存放其記憶體資料是不一樣的,因此兩者不等。對b的兩種轉換意義同上,但是0的整數形式和浮點形式其記憶體資料是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數值意義上)。

注意,程式的輸出會顯示(int&)a=1065353216,這個值是怎麼來的呢?前面已經說了,1以浮點數形式存放在記憶體中,按ieee754規定,其內容為

0x3f800000(大家可以直接除錯看彙編,關於浮點數儲存方式,可以看我的另外一篇部落格)。這也就是a這個變數所佔據的記憶體單元的值。當(int&)a出現時,它相當於告訴它的上下文:「

把這塊位址當做整數看待!不要管它原來是什麼。」這樣,內容0x0000803f按整數解釋,其值正好就是1065353216(十進位制數)。

通過檢視彙編**可以證實「(int)a相當於重新構造了乙個值等於a的整型數」之說,而(int&)的作用則僅僅是表達了乙個型別資訊,意義在於為cout《及==選擇正確的過載版本。

面試題五、下面程式的結果是多少?

unsigned int a = 0xfffffff7;

unsigned char i = (unsigned char)a;

char* b = (char*)&a;

unsigned char* c = (unsigned char*)&a;

printf("%08x,%08x,%08x,%08x",a,i,*b,*c);

答案--fffffff7,000000f7,fffffff7,000000f7

解析--問題不難,但是奇怪的是這麼*b輸出的居然跟int型一樣?哈哈,其實這純屬是巧合而已,如果字元是有符號的,剛好符號位又是1,那麼前面填補的不是0而是1了。

面試題六、下面程式的結果是多少?

unsigned char a = 0xa5;

unsigned char b = ~a>>4+1;

printf("b=%d\n",b);

答案--250

解析--因為+運算子的優先順序高於》,所以b=~a>>5(= ~10101001>>5  = 01010110>>5  = 00000010 = 2 ),奇怪了,不是2嗎?但是在編譯器上執行的結果是250,我們進入彙編指令,會發現儲存變數的暫存器是16位暫存器,所以在暫存器中暫存器表達是 0000 0000 1010 0101取反再移位後就是 0000 0111 1111 1010,unsigned char 型智慧型表示低8位,即250

面試題七、判斷乙個數x是否是2的n次方,不可用迴圈語句

答案--!( x &( x - 1) )

解析--2,4,8,16...轉換為二進位制 10、100、1000、10000....其實就是檢查x的二進位制是否只有乙個1(類似題目,判斷乙個二進位制樹有多少個1)

面試題八、將a、b的值交換,不使用任何中間變數

答案一、a = a+b;

b = a-b;

a = a-b;

該方法很不好,有可能會溢位

答案二、a = a^b;

b = a^b;

a = a^b;

哈哈,你想到了嗎?

你可能不知道的東西

元素可以分為塊級元素,行內元素以及行內塊級元素。行內元素的margin或者padding只有margin left和margin right以及padding left和padding right有效果,margin top margin bottom padding top padding bot...

你可能不知道的const

眾所周知,使用 const 宣告的變數必須同時初始化為某個值。一經宣告,在其生命週期的任何時候都不能再重新賦予新值 const a syntaxerror 常量宣告時沒有初始化 const b 3 console.log b 3 b 4 typeerror 給常量賦值const 宣告只應用到頂級原語...

你可能不知道的python logging機制

先來看幾個例子,先想一下執行結果,答案稍後揭曉 例一 mylogger logging.getlogger mylogger mylogger.info mylogger info mylogger.warning mylogger warning 例二 mylogger logging.getlo...