在c語言經典測試題6的第一題,大家是否想過可不可以將遞歸參數改為s++呢?或許有的人已經試過了,但是發現好像不會有結果,其實是因為s++為后置++,先試用后加1,然而我們這個++是在s出了函數之后才會運行加1操作,又由于該函數為遞歸函數,不會直接出函數,所以該遞歸參數就一直是s不會改變,這樣的話,代碼就會陷入死遞歸。
1.題1
char ch;
int i;
float f;
double d;
如上圖我們定義了4種類型的數據,則表達式: ch/i + (f*d – i) 的結果類型為?
其實在不同類型的數據進行計算時,會統一進行向最高級類型的轉換,在這里基本數據類型的等級從低到高如下:char int long ?oat double運算的時候是從低轉到高的,表達式的類型會自動提升或者轉換為參與表達式求值的最上級類型。所以該表達式的結果類型應該為double類型。
2.題2
#include <stdio.h>
int main()
{
int x = -1;
unsigned int y = 2;
if (x > y)
{
printf("x is greater");
}
else
{
printf("y is greater");
}
return 0;
}
上述代碼運行結果會是什么呢?
我們來分析一下:首先我們創建了一個有符號的整型x,和一個無符號整型y,x是有符號數-1,內存中是全1,當有符號的x和無符號數進行比較時,x會隱式類型轉換被當做無符號數,是一個很大的數,所以此時第一個if條件成立,結果應該是打印x is greater,我們運行看看:
3.題3
int k, a, b;
unsigned int w = 5;
double x = 1.42;
?我們定義了上述數據類型,下列哪一個選項不符合c語言語法表達式:
A: x%3 B: w+=-20 C: k=(a=200,b=300) D: a+=a-=a=9
我們來分析一下:A選項其實很明顯,%取模操作符的兩個操作數必須為整數,而在上述類型中x是double類型得數據,故A錯誤。C選項其實是一個逗號表達式,其表達式的最終結果為最后一個表達式的結果。
4.題4
void func()
{
int k = 1^(1 << 31 >> 31);
printf("%d\n", k);
}
上述代碼的運行結果是什么?
我們來分析一下:我們知道^操作符的運算規則為,相同為0,相異為1。首先()的優先級最高所以先計算()里面的表達式,1<<31,后1的補碼變為10000000000000000000000000000000
然后該補碼又進行>>31,結果變為11111111111111111111111111111111,最后進行^操作后補碼為
11111111111111111111111111111110,這里是補碼·,我們將它還原為原碼為10000000000000000000000000000010,這時的結果就為-2。所以其運行結果應該為-2,我們運行看看:
5.題5
?給你一個含 n 個整數的數組 nums ,其中 nums[i] 在區間 [1, n] 內。請你找出所有在 [1, n] 范圍內但沒有出 現在 nums 中的數字,并以數組的形式返回結果。
int* ?ndDisappearedNumbers(int* nums, int numsSize, int* returnSize){
for (int i = 0; i < numsSize; i++) {
if (nums[abs(nums[i]) - 1] > 0)
nums[abs(nums[i]) - 1] = -(nums[abs(nums[i]) - 1]);
}
int *ret = (int *)malloc(sizeof(int) * (numsSize));
*returnSize = 0;
for (int i = 0; i < numsSize; i++) {
if (nums[i] > 0) {
ret[*returnSize] = i + 1;
*returnSize += 1;
}
}
return ret;
}
還是那句話,勤動腦,多動手。大家要勇于嘗試,加油!祝大家都早日成為大佬。
