1.如果int a = 1, b = 2, c = 3, d = 4;則條件運算式 "a < b ? a : c < d ? c : d" 的值為__?
解析:條件操作符?:的結合性為從右至左,那麼運算式的結合性用括弧表示:(a < b ? a : (c < d ? c : d))
答案:1
2.已知 i = 10; 運算式 "20 - 0 <= i <= 9" 的值為__?
解析:在雙目運算子中,算術運算子的層級最高,關係運算子次之,邏輯運算子最低。運算式的結合性用括弧表示(20 - 0) <= i <= 9
答案:1
3.已知 int x = 1; u;執行語句 "y = ++x > 5 && ++x < 10;" 後變數 x 的值為__?
解析:運算式中單目運算子++最高, 關係運算子層級高於邏輯運算子,賦值運算子=的層級最低。運算式的結合性用括弧表示y = ((++x) > 5) && ((++x) < 10), 對於邏輯運算子&&,前面部分為假時則不會計算後面部分,所以((++x) > 5) 的結果為假後,後面的((++x) < 10)不再進行計算,所以 x 的結果為2,y 的結果為0。
答案:2
4.已知 int i = 1; 執行語句"while(i++ < 4);"後變數 i 的值為__?
解析:n++表示先使用變數n的值,然後將n的值增1;++n表示將n的值增1,然後再使用變數n的值。再例如:*ptr++ 與 *(ptr++) 結果是一致的,都表示"先*ptr,然後ptr++"。
答案:5
5.宏定義:
#define PR(fmt, val) printf(#val " = %" #fmt "/t", (val))
#define NL putchar('/n')
#define PRINT1(f, x1) PR(f, x1), NL
那麼,PRINT1(d, 5);擴充後的結果?
//這個調用先擴充為 RP(d, 5) NL
//然後再擴充 printf(#5 " = %" #d "/t", (5)), putchar('/n')
//最後擴充 printf("5 = %d/t", (5)), putchar('/n'))
摘自《C語言解惑》
6.編程風格關於選擇正確的條件
(1)
do
{
if(!A) continue;
else B;
C;
}while(A);
//第一次改造,先消除“多餘的” continue 語句
do{
if(A) { B; C; }
}while(A);
//第二次改造,再把 "do ... while" 和 if 語句替換為 while 語句
while(A)
{
B;C;
}
(2)
while(c = getchar() != '/n')
{
if(c == ' ')continue;
if(c == '/t')continue;
if(c < '0')return (OTHER);
if(c <= '9')return (DIGIT);
if(c < 'a')return (OTHER);
if(c <= 'z')return (ALPHA);
return (OTHER);
}
return (EOL);
改造後:
while(c = getchar() != '/n')
{
if(c >= 'a' && c <= 'z')return ALPHA;
else if(c >= '0' && c <= '9') return DIGIT;
else if(c != ' ' && c <= '/t') return OTHER;
}
return (EOL);
摘自《C語言解惑》
7.關於指標的一個小題
int p;
*p++ = *(p++)
*++p = *(++p)
++*p = ++(*p)
8.
int a[3][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};
a和a[0]求值為同一個地址,但是它們是有區別的,它們的類型不同,這會導致在對地址進行算術運算時體現出同,a+1和a[0]+1意義不同,前者指向下一個三元的int數組,後者指向下一個int整數指標。