1.題1
#include <stdio.h>
int main()
{
int i = 1;
sizeof(i++);
printf("%d\n", i);
return 0;
}
上述代碼運行結果是什么呢?
我們來分析一下:其實這題的難點就是sizeof操作后i的結果是否會改變,首先我們創建了一個整型i,我們知道i++為后置++,先試用后加1,我們知道一般表達式的運算是在運行時執行的,而sizeof是一個編譯階段就執行的運算符,在其內的任何運算都不執行,只推測出其中表達式結果的類型求其大小,故前后i的值不變。所以i的值還是為1.
我們運行看看:
2.題2
int main()
{
char c='A';
if('0'<=c<='9') printf("YES");
else printf("NO");
return 0;
}
?上述代碼的運行結果是什么呢?
我們來分析一下:上述代碼中字符A的ASCLL值為65,if的判斷條件為‘0’<=c<='9'大家這個時候可能以為這還不簡嗎?不就是判斷ASCLL值的大小,那運行結果應該為NO,事實是這樣嗎?
我們運行看看:
這是怎么回事呢?其實這個if的判斷條件的運算順序是不同的,'0'<=c<='9'并非判斷x大于等于字符0,小于等于字符9,而是先執行'0'<=c,使用這個表達式的結果再和'9'比較,'0'的ASCII碼值是48,'A'的ASCII碼值是'65',故'0'<c是真值1,1無疑是小于字符'9'的,最終是真。
3.題3
unsigned short x = 65530;
unsigned int y = x;
假設編譯器規定 int 和 short 類型長度分別為32位和16位,若有下列C語言語句,則 y 的機器數為:
A: 0000 7FFA B: 0000 FFFA C: FFFF 7FFA D: FFFF FFFA
我們來分析一下:unsigned short類型的x變量2個字節保存了65530,十六進制形式為0xFFFA,x給y賦值時會整型提升,而無符號數在提升時高位補0,其實就相當于把x的值放在了y的低2個字節的空間中,故選B
4.題4
#include<stdio.h>
int main()
{
int n = 1001;
int ans = 0;
for(int i = 1; i <= n; ++i)
{
ans ^= i % 3;
}
printf("%d",ans);
return 0;
}
上述代碼的運行結果是什么呢?
我們來分析一下:i % 3 的值按1、2、0循環,可推算出ans按1、3、3、2、0、0循環,循環進行1001次,而1001%6=5,也就是ans按規律得到的第5個數為最終結果,故ans=0
5.題5
給定一個二進制數組, 計算其中最大連續 1 的個數。示例: 輸入:[1,1,0,1,1,1] 輸出:3 解釋:開頭的兩位和最后的三位都是連續 1 ,所以最大連續 1 的個數是 3.
int ?ndMaxConsecutiveOnes(int* nums, int numsSize){
int max_count = 0, cur_size = 0;;
for (int i = 0; i < numsSize; i++) {
if (nums[i] == 1) {
cur_size++;
}else {
max_count = max_count > cur_size ? max_count : cur_size;
cur_size = 0;
}
}
max_count = max_count > cur_size ? max_count : cur_size;
return max_count;
這題的思路較為簡單,統計連續1的個數,遇到0時表示連續中斷,判斷如果當前的統計數大于之前最大的則替換,然后繼續下一個位置開始的統計即可。
