作者MaxHaru (懂得放手..才是王道)
看板C_and_CPP
標題Re: [問題] 一些考題有請指教
時間Mon Apr 15 15:04:07 2013
獻醜了..
※ 引述《tsamarfi (一 擊 入 魂)》之銘言:
: 各位好,目前在準備國考,又是個程式新手,碰到以下幾個問題想請各位指點,謝謝。
: 我會加入些我的想法,請指正,錯得離譜請海涵<(_ _)>
: 1. #include<stdio.h>
: int main() {
: int choice=1;
: switch(choice)
: {
: case 1:
: printf("*");
: case 2:
: printf("**");
: case 3:
: printf("***");
: }
: return 0;
: }
: 答案:******
: 我的想法:choice=1,應該是case 1的輸出吧?就是一顆而已。但是答案是六顆,
: 感覺像是case1到3全跑過一次!?
我的看法: 因為case中沒有break; 所以會從case1一路做到case3; 所以是6顆..
: ==============================================================================
: 2. (只節錄一段看不懂的部分,是條件判斷)
: a=10, b=5
: if(!a>100 && b<6)是真還是假呢?
: 我的想法:b<6是真,但是a>100是假,但因為前面有個代表否定的"!"所以變成真。
: 因此真&&真=真。
(a>100)==>false
!(a>100)==>true
b<6 ==>true
所以(!a>100 && b<6)==>true
PS:我實在不想去背運算子的優先順..
: ==============================================================================
: 3. #include<stdio.h>
: int main()
: {
: int a=64, b=1;
: printf("%/d", a>>(1+(b<<2)));
: return 0;
: }
: 答案:2
: 我的想法:這題真的搞不懂...抱歉。
a=1000000(二進制)
a>>(1+(b<<2))==>a>>(1+(4))==>a>>5==>a=2
: ==============================================================================
: 4. #include<stdio.h>
: int foo1(int v)
: {
每次呼叫都會執行a=0
所以return值等於v
: int a=0;
: a+=v;
: return a;
: }
: int foo2(int v)
: {
因為有static, 所以a=0只會做一次,
所以return值等於上次的a + 這次的v
: static int a=0;
: a+=v;
: return a;
: }
: int main()
: {
: foo1(10);
foo2(10);==>a=10
: foo2(10);
foo2(5);==>a=10+5
: printf("%d %d", foo1(5), foo(5));
: return 0;
: }
: 答案:5 15
: 我的想法:一開始foo1和foo2的v=10,所以加進去後兩者的a=10,接著printf內再
: 輸入v=5,再加進a裡面,foo1應該為15,foo2的a被static,所以還是5。
: 輸出應該為 15 5。但是完全顛倒...
: ==============================================================================
: 以上幾題請不吝指教,謝謝!
以上..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.210.106.78
→ azureblaze:logical_not的優先度高於比較運算 04/15 15:53
→ azureblaze:連我剛寫完這個部份的parser都還記不太清楚 04/15 15:54
→ azureblaze:寫這樣code的人是不是很該死XD 04/15 15:55
推 BlazarArc: 推樓上XD 04/15 17:44
→ iamnotgm:1樓的意思是他會先作!a才去比較他是不是大於100? 04/15 22:57
→ iamnotgm:!a是個什麼東西阿 a是10耶 = =? 04/15 22:58
→ adrianshum:樓上:C/C++ 中,非 0/null 即代表 true. !a 即 false 04/15 23:05
→ adrianshum:亦即是 0 04/15 23:05
→ azureblaze:!a => !((bool)a) => !(a!=0) => !(true) => false 04/15 23:06
→ azureblaze:這也是不太直覺的東西,所以像C#就禁止 04/15 23:11
→ azureblaze:implict bool cast。 c寫慣了會覺得他很煩就是了 04/15 23:11
推 xxxx9659:沒背運算子的優先順,所以就錯了XD 04/16 13:07
推 pujols05:請問呼叫完foo2(),a和v不是就會被清除了,為什麼foo2(5) 04/28 22:10
→ pujols05:foo2(5);==>a=10+5,他的變數v的值還存在,沒有被清除? 04/28 22:12