C Puzzlesã®æ¥æ¬èªè¨³ããã£ãã®ã§ãè§£ãã¦ã¿ãã
- åæ
- æ¥æ¬èªè¨³
å¤ä¼ã¿ä¸ã«è§£ããã®ã§ãä¸å¿ãå¤ä¼ã¿ã®èª²é¡ãã«ãªãã®ããªãã¨ãããããæè©®ã¯èªç§°Cããã°ã©ããªã¬ãã«ã®åéããæã£ã¦ãªããã¨ãå確èªããããã¼ããä¿®è¡ãè¶³ãã¬ã
以ä¸ãå顿ã¯ä¸è¨ã®ç¿»è¨³çããã®ã³ãããã¡ãã£ã¨æ°ã«ãªãé¨åã ãè¨æ£ãã¦ãããåé¡ã«çªå·ãå²ãæ¯ããã¦ãããªããå顿ãã³ãã¼ããªãã¦æ¸ãã ã®ã ãã©â¦â¦ã
æ¥ä» | å 容 | åè |
---|---|---|
2015-08-29 | åç使 | æ®ã4å |
1
次ã®Cããã°ã©ã ã¯ãé åã®è¦ç´ ã表示ãã¦ãããã¯ãã§ããããããå®éã«èµ°ããã¦ã¿ãã¨ãæå¾ ããåºåãå¾ããã¾ããã
#include<stdio.h> #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int array[] = {23,34,12,17,204,99,16}; int main() { int d; for(d=-1;d <= (TOTAL_ELEMENTS-2);d++) printf("%d\n",array[d+1]); return 0; }
ä½ãééã£ã¦ããã®ã§ããããã
å®è¡ããã¨ãä½ã表示ãããªããæé»ã®å夿ã®ã«ã¼ã«ãåå ã§ãforæã®ç¶ç¶æ¡ä»¶ã®å¤å®çµæããã®ã³ã¼ãã®ä½è ã®æå³ã¨ç°ãªã£ã¦ãã¾ã£ã¦ããã
ãã¯ãTOTAL_ELEMENTSã§ä½¿ç¨ãã¦ããsizeofæ¼ç®åã¯size_tåï¼ç¬¦å·ãªãåºç¾©æ´æ°åï¼ãè¿ãã大åã®å¦çç³»ã§ã¯ãsize_tåã®å®ä½ã¯unsigned longåã§ãããå¼(TOTAL_ELEMENTS-2)
ãè©ä¾¡ããå¤ã®åã¯size_tåã«ãªãã
foræã«ã¦å¤æ°dã«-1ã代å
¥ããç´å¾ãå¼d <= (TOTAL_ELEMENTS-2)
ã«ã¦ã夿°dãintåããsize_tåã«å夿ãããçµæã0xFFFFFFFFLUã¨åããããåã®ç¬¦å·ãªãæ´æ°åã¨è¦ãªããã¦ãã¾ãã(TOTAL_ELEMENTS-2)
ããã大ããã¨å¤å®ããã¦å³åº§ã«ã«ã¼ããçµäºãã¦ãã¾ãã
èããä¿®æ£æ¹æ³ã¯2ã¤ã
1ã¤ç®ã¯ã夿°dãsize_tåã«ããä¸ã§ãè² ã®å¤ã使ããªãããã«ããæ¹æ³ãæåãã符å·ãªãæ´æ°åã§çµ±ä¸ãã¦ãã¾ãã°ãè² ã®å¤ã«ããæé»ã®å夿æã®åé¡ã¯çºçããªãã
2ã¤ç®ã¯ãå¼(TOTAL_ELEMENTS-2)
ãintåã«ãã£ã¹ããã¦ç¨ããæ¹æ³ãããªãã¡d <= (int) (TOTAL_ELEMENTS-2)
ã®ããã«ãã¦æ¯è¼ãããããããã°intåå士ã§ã®æ¯è¼æ¼ç®ã¨ãªãã®ã§ãæé»ã®å夿ã¯çºçããªãã
2
次ã®ã³ã¼ããè¦ã¦ãç§ã¯å®ç§ãªCããã°ã©ã ã ã¨æãã¾ãããããããã³ã³ãã¤ã«ããéã«ãä¸ããªãééããè¦ã¤ãã¦ãã¾ãã¾ãããä½ã ãåããã¾ããï¼ï¼ã³ã³ãã¤ã«ããã«ææãã¦ãã ãã:-ï¼
#include<stdio.h> void OS_Solaris_print() { printf("Solaris - Sun Microsystems\n"); } void OS_Windows_print() { printf("Windows - Microsoft\n"); } void OS_HP-UX_print() { printf("HP-UX - Hewlett Packard\n"); } int main() { int num; printf("Enter the number (1-3):\n"); scanf("%d",&num); switch(num) { case 1: OS_Solaris_print(); break; case 2: OS_Windows_print(); break; case 3: OS_HP-UX_print(); break; default: printf("Hmm! only 1-3 :-)\n"); break; } return 0; }
颿°åOS_HP-UX_print
ã¯ãã¤ãã³ãã¤ãã¹ï¼ã-ãï¼ãå«ãã§ãããããèå¥åã¨ãã¦æ£ãããªãããªã®ã§ã³ã³ãã¤ã«æã«å½è©²é¨åã§ã¨ã©ã¼ã¨ãªãã
èå¥åã«ãã¤ãã³ãã¤ãã¹ãå«ãã§ãã¦ãåé¡ãªãããã°ã©ãã³ã°è¨èªã£ã¦ãLispï¼ClojureãCommon LispãEmacs LispãISLispãSchemeããã®ä»ï¼ã¨Tclã¨ã·ã§ã«ã¹ã¯ãªããã¨PowerShellã¨ããããã¡ã¤ã«ä»¥å¤ã«ä½ãããã®ã ãããï¼ãããã°ã©ãã³ã°è¨èªãå¦ããç¡è¦ãããªããCSSãXMLã該å½ãããã
3
次ã®ããã°ã©ã ããã¯ã©ã®ãããªåºåãå¾ãããã§ããããï¼ãã¾ãããã®çç±ãçãã¦ãã ããã
enum {false,true}; int main() { int i=1; do { printf("%d\n",i); i++; if(i < 15) continue; }while(false); return 0; }
æ¨æºåºåã«1ã¨ã ãåºåãããã
夿°iã«1ã代å
¥ããå¾ãdoæã®printfã¨i++
ãå®è¡ãããå¼i < 15
ãçãªã®ã§continueãå®è¡ãããwhile(false)
ãè©ä¾¡ããã¦å½ã¨ãªãã®ã§ã«ã¼ããæããã
æ£ç´ãªã¨ããããã®åé¡ãæå³ããã¨ãããæ´ã¿ããã¦ããã®ã ãâ¦â¦ããããã¦ããdo-whileæã§continueããã¨ç¶ç¶æ¡ä»¶ãå¤å®ãããªããã¨æãè¾¼ãã§ãã人ãããï¼
4
次ã®ããã°ã©ã ã¯âhello-outâã¨åºåãã¦ãããããã«ã¯âè¦ãâã¾ãããï¼å®è¡ãã¦ã¿ã¦ãã ããï¼
#include <stdio.h> #include <unistd.h> int main() { while(1) { fprintf(stdout,"hello-out"); fprintf(stderr,"hello-err"); sleep(1); } return 0; }
ã©ããªçç±ãèããããã§ããããã
æ¨æºåºåã¯IOã®é«éåã®ããã«ãããã¡ãªã³ã°ãã¦ãããããå®éã«ãã¼ã¿ãæ¸ãåºãæ¡ä»¶ã«éããã¾ã§ãæ¨æºåºåã«æ¸ãè¾¼ãã ãã¼ã¿ã¯å é¨ã®ãããã¡ã«æºãããã¦ããã
setvbuf(3)ã®ãããã¡ãªã³ã°ã®ç¨®é¡ã«ãã¨ã¥ãã°ã_IOFBFãªãã°ãããã¡ãæºæ¯ã«ãªã£ããåºåããããã_IOLBFãªãã°æ¹è¡ãæ¸ãè¾¼ã¾ããããããã¡ãæºæ¯ã«ãªã£ããåºåãããã
ä¸è¨ã®ã½ã¼ã¹ã³ã¼ãã®ãããªä½¿ãæ¹ã®å ´åã¯ãæ¨æºåºåã«æ¸ãè¾¼ãã ãã¼ã¿ã¯ããããã¡ãæºæ¯ã«ãªãã¾ã§è¡¨ç¤ºããããæºæ¯ã«ãªã£ããä»ã¾ã§æ¸ãè¾¼ãã åã䏿°ã«è¡¨ç¤ºããããhello-outã¨hello-errã交äºã«åºåããããªãã°ãfprintf(stdout,"hello-out");
ã®ç´å¾ã«fflush(stdout);
ãå®è¡ããããäºãæ¨æºåºåã®ãããã¡ãªã³ã°ã_IONBFï¼ãããã¡ãªã³ã°ããªãï¼ã«ãã¦ãããã¨ã
5
#include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n",h(f(1,2))); printf("%s\n",g(f(1,2))); return 0; }
ãã®ããã°ã©ã ãè¦ã¦ã両æ¹ã®printfã®åºåã¯åãã«ãªãã¨èãã人ãããããããã¾ãããããããããã°ã©ã ãèµ°ãããã¨ã次ã®çµæãåå¾ãã¾ãã
bash$ ./a.out 12 f(1,2) bash$
ãªããããªãã®ã§ããããï¼
ãã¯ãã®æ¼ç®å#
ã¯ãã¼ã¯ã³ããã¯ãç½®æãããã¨ãªãæåå宿°ã«å¤æããã
ãã®ããg(f(1,2))
ã¯ã弿°f(1,2)
ããã¯ãç½®æããã«æåå宿°ã«å¤æãããã¨ã«ãªããæåå"f(1,2)"
ã¨ãªãã
䏿¹ã§h(f(1,2))
ã®å ´åããã¯ã颿°h()
ã§ã¯å¼æ°ããã¯ãç½®æããããããã¾ãh(f(1,2))
ãå±éãããçµæg(12)
ã¨ãªããããããg(12)
ãå±éããã¦æåå"12"
ã¨ãªãã
6
#include<stdio.h> int main() { int a=10; switch(a) { case '1': printf("ONE\n"); break; case '2': printf("TWO\n"); break; defa1ut: printf("NONE\n"); } return 0; }
ä¸è¨ããã°ã©ã ã®åºåãNONEã«ãªãã¨äºæ¸¬ãããªããæ¬å½ã«ãããªãããã²ãã§ãã¯ããã¦ã¿ã¦ãã ãã!!
ä½ã表示ãããªãã
switchæãããè¦ãã¨defaultã§ã¯ãªãdefa1ut
ã¨ãªã£ã¦ããããã®ãããåãªãgotoã®ã©ãã«ã¨è¦ãªããã¦ãã¾ããæ®ãã®caseæã®æ¡ä»¶ã«åè´ãããã®ããªããããswitchæä¸ã®ã¹ãã¼ãã¡ã³ãã¯ä½ãå®è¡ãããªãã
7
次ã®Cããã°ã©ã ã¯IA-64ã§ã¯ã»ã°ã¡ã³ãã¼ã·ã§ã³éåã§ãããIA-32ã§ã¯ãã¡ãã¨åãã¾ãã
int main() { int* p; p = (int*)malloc(sizeof(int)); *p = 10; return 0; }
ãªããã®ãããªãã¨ãèµ·ããã®ã§ããããï¼
malloc(3)ãæåãã¦ãããã®ã¨ä»®å®ãã¦è§£çããã¨ãstdlib.hãã¤ã³ã¯ã«ã¼ããã¦ããªãããããã®ããã°ã©ã ã®ã³ã³ãã¤ã«æã«malloc(3)ã®æ»ãå¤ãintåã§ããã¨æé»ã®ãã¡ã«è§£éããããªãã¸ã§ã¯ãã³ã¼ããçæããã¦ããã
IA-64ã§ã¯ãã¤ã³ã¿åã¯64bitã ããä¸è¨çµç±ãããæ¬æ¥malloc(3)ãè¿ã64bitã®å¤ã®ãã¡intåã«åã¾ã32bitã®å¤ããããããint*ã«ãã£ã¹ããã¦64bitåããå¤ãã夿°pã«æ ¼ç´ãããããã®å¤ã¯ä¸æ£ãªã¢ãã¬ã¹å¤ï¼64bitä¸32bitããæ£ãããªãï¼ã§ããããã䏿£ãªã¢ãã¬ã¹ã«ä»£å ¥ãã¦ã»ã°ã¡ã³ãã¼ã·ã§ã³éåã¨ãªãã
ãããOSã®ããã»ã¹ã®ã¡ã¢ãªã¢ãã«æ¬¡ç¬¬ã ãã©ãx86-64ã§64bit OSã使ã£ã¦ããå ´åã«ãèµ·ãããã§ã¯ãªãã ãããï¼
8
9
次ã®ããã°ã©ã ããã¯ãã©ããªåºåãå¾ãããã¨æãã¾ããï¼ãã¾ãããã®çç±ãçãã¦ãã ãããï¼ãã
âfã¯1.0â³"f is 1.0"ã ã¨æãã®ã§ããã°ãããä¸åº¦ã確èªãã¦ã¿ã¦ãã ããï¼
#include <stdio.h> int main() { float f=0.0f; int i; for(i=0;i<10;i++) f = f + 0.1f; if(f == 1.0f) printf("f is 1.0 \n"); else printf("f is NOT 1.0\n"); return 0; }
f is NOT 1.0ã¨åºåãããã
ãããã0.1ã®äºé²æ°è¡¨ç¾ï¼âbitåã«ãã表ç¾ï¼ã¯å¾ªç°å°æ°ã¨ãªãããã使ç¨ãã¦ããæµ®åå°æ°ç¹æ°ã®å½¢å¼ãäºé²æµ®åå°æ°ç¹å½¢å¼ã§ãããªãã°ã0.1ãæ£ç¢ºã«è¡¨ç¾ãããã¨ãã§ããªããè¿ä¼¼å¤ãç¨ãã¦ãããã¨ã«ãªããããå ç®ãç¹°ãè¿ãã»ã©èª¤å·®ãåºãã£ã¦ããã10åå ç®ããçµæã1.0ã«ãããã«æºããªãå¤ã«ãªã£ã¦ãã¾ãããã1.0ã¨ã®æ¯è¼ãçã¨ãªããã¨ã¯ããããªãã
10
Cè¨èªã®ã«ã³ãæ¼ç®åã«ã¤ãã¦å¦ãã§ããã®ã§ã次ã®Cããã°ã©ã ã¯å®ç§ã ã¨æã£ã¦ãã¾ããããããããã®ããã°ã©ã ã«ã¯èª¤ããããã¾ããããã¯ä½ã§ããããï¼
#include <stdio.h> int main() { int a = 1,2; printf("a : %d\n",a); return 0; }
ãã®æ¸ãæ¹ã§ã¯ãint a = 1,2;
ã®ã³ã³ãã¯åæå宣è¨å並ã³ã«ãããåºåãã®ã³ã³ãã§ããã¨è§£éããããã³ã³ãããå¾ãç¬ç«ããåæå宣è¨å並ã³ã¨è§£éãããã¨è©¦ã¿ã䏿£ãªå½¢å¼ã§ãããããã³ã³ãã¤ã«ã¨ã©ã¼ã¨ãªãã
int a = (1,2);
ã®ããã«æ¬å¼§ã§å²ãã°ã1,2
ã¯ã³ã³ãæ¼ç®åãå«ã1ã¤ã®åæååã§ããã¨è§£éããããããã³ã³ãã¤ã«ã¨ã©ã¼ã¯èµ·ããªãã
11
次ã®Cããã°ã©ã ããã¯ãã©ã®ãããªåºåãå¾ãããã§ããããï¼ãï¼ãã®Cããã°ã©ã ã¯æ£ããåãã§ããããï¼ï¼
#include <stdio.h> int main() { int i=43; printf("%d\n",printf("%d",printf("%d",i))); return 0; }
ç»é¢ã«4321ã¨è¡¨ç¤ºããããæ«å°¾ã¯æ¹è¡ããã¦ããã
æåã®43ã¯ãã¹ãã®æãå å´ã®printfã夿°iã®å 容ã表示ãããã®ã次ã®2ã¯ããã¹ãã®çãä¸ã®printfãããã¹ãã®å å´ã®printfã®æ»ãå¤ï¼åºåããæåæ°ã§ãã2ï¼ã表示ãããã®ãæå¾ã®1ã¨æ¹è¡ã¯ããã¹ãã®å¤å´ã®printfãããã¹ãã®çãä¸ã®printfã®æ»ãå¤ï¼åºåããæåæ°ã§ãã1ï¼ã表示ãããã®ã
12
void duff(register char *to, register char *from, register int count) { register int n=(count+7)/8; switch(count%8){ case 0: do{ *to++ = *from++; case 7: *to++ = *from++; case 6: *to++ = *from++; case 5: *to++ = *from++; case 4: *to++ = *from++; case 3: *to++ = *from++; case 2: *to++ = *from++; case 1: *to++ = *from++; }while( --n >0); } }
ä¸ã®Cè¨èªã®ã³ã¼ãã¯ãæ£ããåãã§ããããï¼ãããåãã®ã§ããã°ããã®ã³ã¼ãã«ãã£ã¦ä½ãå¾ããã¨ãã§ãã¾ããï¼ããªãã誰ãããã®ãããªã³ã¼ããæ¸ãã®ã§ããããï¼
æåãªDuff's Deviceã®æ¹å¤çããªãªã¸ãã«ã¯ã¡ã¢ãªããããIOã®ãã¼ãã¦ã§ã¢ã«ã¦å¨è¾ºæ©å¨ã¸ã®æ¸ãè¾¼ã¿ã«ç¨ããã³ã¼ãã ã£ãããã夿°toãã¤ã³ã¯ãªã¡ã³ãããªãããã®ã³ã¼ãã¯ãã¡ã¢ãªããã¡ã¢ãªã¸ã®ãã¼ã¿ã³ãã¼ç¨ã«æ¹å¤ããããã®ã«ãªããåæ³çãªã³ã¼ãã§ããã
ãã®ã³ã¼ãã®æå³ã¯ãã¾ã第ä¸ã«ã«ã¼ãå±éã«ããé«éåã§ãããdoã«ã¼ãä¸ã§ã³ãã¼ã8åè¡ããã¨ã§ãç¶ç¶æ¡ä»¶ã§ã®æ¯è¼æ¼ç®ã®åæ°ãç´8åã®1ã«æ¸ããããå¦çã®é«éåãæå¾ ã§ããã第äºã«ãã«ã¼ãå±éããã¨ãã«çãã端æ°åã®ã³ãã¼å¦çã¸ã®å·§å¦ãªå¯¾å¿ã§ãããã³ãã¼ãããã¤ãæ°ãã«ã¼ãå±éãããã¤ãæ°ã§å²ãåããªãå ´åãã¾ãswitchæã«ã¦0以å¤ã®caseæã«ã¸ã£ã³ããã¦ãFALLTHROUGHãå©ç¨ãã¦ç«¯æ°åã®ã³ãã¼ãè¡ãããã®å¾do-whileæã®ç¶ç¶æ¡ä»¶ã®ãã§ãã¯ãçµã¦ãæ®ãã®ã³ãã¼ãã«ã¼ãå±éãããdoã«ã¼ãã«ã¦å®æ½ããã
ã«ã¼ãå±éã«ããé«éåãã端æ°å¦çã®å·§å¦ãªå¯¾å¿ããããæå³Cããã°ã©ãã¼ãããã¨ãããæ°ãããªãã§ããªããã¨ããã®ãããã®ã³ã¼ãã®ã¢ã«ã´ãªãºã ã¯ãã¢ã»ã³ãã©ã«ã¦æ¯è¼ã»åå²å½ä»¤ãæå°éã«æããã³ãã¼å¦çãè¨è¿°ããã±ã¼ã¹ã«é常ã«è¿ãããã¤ã¦ã®ã·ã¹ãã ã»ããã°ã©ãã³ã°ã§ã¯ãç¾å¨ãããé¥ãã«éããããã¼ãã¦ã§ã¢ã»ãªã½ã¼ã¹ã®ä¸ã§ãç¾å¨ãããæé©åæ§è½ãä½ãã£ãã³ã³ãã¤ã©ãç¨ãã¦ãããã¨ããããé«éãªå¦çãå®ç¾ããããã«ã¢ã»ã³ãã©çãªææ³ãæ¡ç¨ãããã¨ãå¤ãã£ãï¼ç¾å¨ã§ããçµã¿è¾¼ã¿åéã§ã¯åæ§ã®å¾åãã¿ãããï¼ã
ãã£ã¨ãé«éåã®è¦³ç¹ã§è¨ãã°ãç¾å¨ã§ã¯ãã®ã³ã¼ãã«ã¯æ¬¡ã®ãããªåé¡ãããï¼
- ãªãªã¸ãã«ã®Duff's Deviceãªãã¨ããããã¡ã¢ãªããã¡ã¢ãªã¸ã®ã³ãã¼ãªãmemcpy(3)ã®æ¹ãé«éã§ããå¯è½æ§ãé«ããåç°å¢ã«å¿ããæé©åããªããã¦ãããã夿°ã®äººã使ç¨ãã¦ããå®ç¸¾ãããã
- ããããå·§å¦ãªã³ã¼ãã¯ãã³ã³ãã¤ã©ãæé©åãè¾ãã
- ç°å¢ã«ãã£ã¦ã¯ç«¯æ°å¦çãç¬ç«ããã¦2ã¤ã®å¦çã«åããæ¹ãé«éãããã
- ç°å¢ã«ãã£ã¦ã¯ãCPUã®é«éåæ©è½ï¼ãã¤ãã©ã¤ã³ã¨ãï¼ããã¾ãæ©è½ããªãå¯è½æ§ããããããã
13
14
次ã®2ã¤ã®é¢æ°ã®ãããã¿ã¤ã宣è¨ã¯åãã§ããããï¼
int foobar(void); int foobar();
éãï¼åãã§ã¯ãªãï¼ã
int foobar(void);
ã¯ANSI C89ã§æ¡ç¨ããã颿°ãããã¿ã¤ã宣è¨ã§ãããæ»ãå¤ã®åã¨ã弿°ã®åã¨é åºï¼ããã§ã¯å¼æ°ãä½ãã¨ããªããã¨ï¼ããã§ãã¯å¯¾è±¡ã¨ãªãã
䏿¹ãint foobar();
ã¯K&R以åã§ç¨ãããã¦ãã颿°ã®åæ¹å®£è¨ã§ããï¼ãããã¿ã¤ã宣è¨ã§ã¯ãªãï¼ãæ»ãå¤ã®åã®ã¿ããã§ãã¯å¯¾è±¡ã¨ãªãã弿°ã®åã¨é åºï¼ãã®ä¾ã§ã¯ã弿°ãã¨ããªããã¨ï¼ã¯ãã§ãã¯å¯¾è±¡å¤ã¨ãªãã
ï¼å®£è¨ãå¯è¦ã§ãããªãï¼åè ã®å½¢å¼ãç¨ããã°ãã³ã³ãã¤ã«æã«èª¤ã£ã¦å¼æ°ã«å¤ãæå®ãã¦ããã³ã¼ããçºè¦ãããè¦åãåºåãããã¯ãã§ããã䏿¹ã§å¾è ã®å½¢å¼ã§ã¯ã誤ã£ã¦å¼æ°ã«å¤ãæå®ããã³ã¼ããè¨è¿°ãã¦ãã¾ã£ãéãã³ã³ãã¤ã«æã«è¦åããããã¨ã¯ãªãããã®ãããªããã°ã©ã ãå®è¡ããã¨ãä½ãåé¡ãèµ·ãããªããããããªãããåå 䏿ã®ã¨ã©ã¼ãçºçãã¦æ£ã ãªç®ã«éããããããªãã
ãªãä¸è¨ã®è§£éã¯è¦æ ¼Cã«ãã¨ã¥ããC++ã§ã¯ããã®2ã¤ã®å®£è¨ã¯ã©ã¡ããåãæå³ãæã¤é¢æ°ãããã¿ã¤ã宣è¨ã§ããã
15
次ã®ããã°ã©ã ããã¯ãã©ã®ãããªåºåãå¾ãããã§ããããï¼ãã¾ãããã®çç±ãçãã¦ãã ããã
#include <stdio.h> int main() { float a = 12.5; printf("%d\n", a); printf("%d\n", *(int *)&a); return 0; }
12.5ãå°æ°é¨ãé¤ãã12ã®ãããªå¤ã¨ã¯å ¨ãå¥ç©ã®ãããåãããªãå¤ãåºåãããã2ã¤ã®åºåã¯ç°ãªããã®ã§ããå¯è½æ§ãé«ãã
printf(3)ã®ãããªå¯å¤é·å¼æ°ã®é¢æ°ã¯ããããã¿ã¤ã宣è¨ã«ããåãã§ãã¯ã®å¯¾è±¡å¤ã§ããã仮弿°ã¸ã®ä»£å ¥æã«å夿ãè¡ããããã¨ããªããããªãã¡ãä¸è¨ã³ã¼ãã«ãããprintf(3)ã§ã¯ã夿æå®ã«ã¦%dï¼intåï¼ãæå¾ ãã¦ãããã®ã®ãå½è©²å¤ææå®ã«å¯¾å¿ãã弿°ã®å¤ãæé»ã®ãã¡ã«intåã«å¤æããããããªãã¨ã¯ãªããä¸ãããã夿°ã®åãã®ã¾ã¾ã«ãprintf(3)ã«å¼ã渡ãããã
ã¾ããå¯å¤é·å¼æ°ã§ã¯K&Rã®é ã«ã¯ã馴æã¿ã ã£ãææ ¼å¤æãè¡ãããããã®ãããcharåãshortåã®å¤ã¯intåã«ãfloatåã®å¤ã¯doubleåã«å¤æãããã
printf("%d\n", a)
ã§ã¯ã夿°aãdoubleåã«ææ ¼å¤æãããå¤ãå®å¼æ°ã¨ãã¦printf(3)ã«å¼ã渡ããããintåã32bitãdoubleåã64bitã®ç°å¢ã§ã¯ã(double)12.5
ã®64bitã®è¡¨ç¾ã®ãã¡ãä¸ä½ã¢ãã¬ã¹å´ã®32bitã®ãããåã®ä¸¦ã³ãintåã¨ãã¦è§£éããå¤ãåºåãããã
printf("%d\n", *(int *)&a)
ã§ã¯ã夿°aã®ãããåã®ä¸¦ã³ãintåã¨ãã¦è§£éããintåã®å¤ãå®å¼æ°ã¨ãã¦printf(3)ã«å¼ã渡ãããããããã®ã¾ã¾åºåããããintåãfloatåã32bitã§ããç°å¢ã ã¨ä»®å®ããã¨ãã¦ãåã32bitã®ãããåã§ããã®è§£éã¯å¤§ããç°ãªãããã®ãããå
ã®12.5ãè¿ä¼¼å¤ã®12ã¨ã¯ä¼¼ã¦ãä¼¼ã¤ãã¬å¦ãªå¤ãåºåããããã¨ã«ãªãã
16
次ã®ããã°ã©ã ã¯ã2ã¤ã®ãã¡ã¤ã«ã«åããå°ããªCããã°ã©ã ã§ãããããã®ãã¡ã¤ã«ãã³ã³ãã¤ã«ããå®è¡ããã¨ãããã®ããã°ã©ã ããã¯ã©ã®ãããªåºåãå¾ãããã§ããããï¼
int arr[80];
extern int *arr; int main() { arr[1] = 100; return 0; }
ã¾ãåæã¨ãã¦ãé
åã¨ãã¤ã³ã¿ã¯å¥ç©ã§ãããã¤ã¾ãint arr[80]
ã¨int *arr
ã¯å¥ç©ã§ããããã£ã¦extern int *arr;
ã¯int arr[80];
ã®åç
§ï¼å®£è¨ï¼ã§ã¯ãªãã
ãã®ããã°ã©ã ã®æåã¯ãå¤é¨å¤æ°ã®å®ç¾©åºç¾ã¨åç
§åºç¾ã®åºå¥ã«ã¤ãã¦ã³ã³ãã¤ã©ãæ¡ç¨ãã¦ããã¢ãã«ã«ä¾åãããããã³ã³ãã¤ã©ã§ã¯ãint arr[80];
ã¨extern int *arr;
åæ¹ãåç
§ã¨ã¿ãªããå®ç¾©ãåå¨ããªããããªã³ã¯ã«å¤±æãããããããªããå¥ã®ã³ã³ãã¤ã©ã§ã¯ãint arr[80];
ã¨extern int *arr;
åæ¹ãå®ç¾©ã¨ã¿ãªããåãååã®å®ç¾©ãéè¤ãããããªã³ã¯ã«å¤±æãããããããªããã¾ãå¥ã®ã³ã³ãã¤ã©ã§ã¯ãint arr[80];
ãå®ç¾©ã¨ãextern int *arr;
ãåç
§ã¨ã¿ãªããå®ç¾©ã¨åç
§ã¨ã§é£ãéãããããããªã³ã¯ã«å¤±æãããããããªããããã«å¥ã®ã³ã³ãã¤ã©ã§ã¯ãint arr[80];
ãåç
§ã¨ãextern int *arr;
ãå®ç¾©ã¨è¦ãªããint arr[80];
ã使ç¨ãã¦ãã形跡ãã¿ãããªãããã³ã³ãã¤ã«æã«åãé¤ãããªã³ã¯ã«ã¯æåãããã®ã®ãå®è¡æã«éçãªãã¸ã§ã¯ãã®ããåæåæã«NULLã«ãªã£ã¦ããarrãåç
§ãã¦å¤ãæ¸ãè¾¼ããã¨ãã¦ããã°ã©ã ãè½ã¡ããããããªãã
è¦æ ¼Cã¨ãã¦ã¯ããªã³ã¯ã«å¤±æããæ£ããããã«æãããããVisual Studio 2013ãGCC 4.8.1ã§ã¯ãããã°ã©ã ãè½ã¡ããã¨ãªãã
ãªãè峿·±ããã¨ã«ããããCè¨èªã§ã¯ãªãC++ã®ã³ã¼ãã ã£ãå ´åãGCC 4.8.1ã§ã¯Cè¨èªã®æã¨åããããã°ã©ã ãè½ã¡ãããVisual Studio 2013ã§ã¯ãªã³ã¯ã«å¤±æãããC++ã®ã¢ãã«ã¯è¨æ¶åã¯ã©ã¹çç¥ã¢ãã«ã¨åããªã®ã§ããã®ç¹ã«ã¤ãã¦ã¯Visual Studio 2013ã®æ¹ãæ£ããããã«æãããã
17
次ã®Cããã°ã©ã ã®åºåã説æãã¦ãã ããï¼åºåã¯20ã§ã¯ããã¾ããï¼ã
#include<stdio.h> int main() { int a=1; switch(a) { int b=20; case 1: printf("b is %d\n",b); break; default:printf("b is %d\n",b); break; } return 0; }
夿°bã®å¤ã¨ãã¦ä½ã表示ããããåãããªãã
switchæã«ã¦æåã®caseæãããåã®ä½ç½®ã§å¤æ°ã®å®£è¨ã¨åæåãè¡ããcaseæå ã§ä½¿ç¨ãããã¨ããå ´åããã®å¤æ°ã®ã¹ã³ã¼ãã¯switchæã®å å´ã«ãªãããåæåãè¡ãããªãããã®ããã夿°ã®å¤ã¯ä¸å®ã¨ãªãã
ããã¯ãswitchæã§ã®å¶å¾¡ã®ç§»è¡ãgotoã«è¿ãããã§ãããè¦ã¯ã次ã®ãããªã³ã¼ãã¨ç価ã ã¨èããã°åãããããã
#include<stdio.h> int main() { int a=1; if(a == 1) goto CASE_1; else goto CASE_DEFALUT; { int b=20; CASE_1: printf("b is %d\n",b); goto END; CASE_DEFALUT: printf("b is %d\n",b); goto END; } END: return 0; }
int b=20;
ãå®è¡ãããã¨ãªãgotoã§é£ã³è¶ãã¦ãã¾ã£ããã§ã¯bã¯ã©ããªãã®ãï¼ãCè¨èªã§ã¯ã夿°bèªä½ã¯å®ç¾©ãããããåæåã®ã³ã¼ãã¯å®è¡ãããªããä»®ã«ã¤ã³ã¿ããªã¿çã«é次å®è¡ããè¨èªã ã£ãã¨ãããã夿°ã®å®ç¾©ããããããçµæã¨ãã¦æªå®ç¾©ã®å¤æ°bãåç
§ãããã¨ã«ãªã£ã¦ããã ããã
ãªãããã®æåã¯C++ã§ãåæ§ã ããC++ã§ã¯ã³ã³ãã¤ã©ã®ãã§ãã¯ãå³ãããããã³ã³ãã¤ã«ã¨ã©ã¼ã¨ãªããããããC++ã§ã¯ãããã¯å é 以å¤ã§å¤æ°ã®å®£è¨ã¨åæåãå¯è½ã§ãããããåæ§ã®åé¡ãé常ã®å¤æ°å®£è¨ã¨gotoæã§ãèµ·ããããã ããã
static void f(const bool b) { using std::cout; using std::endl; if (b) goto FOO; int a = 1; FOO: cout << a << endl; }
18
次ã®ããã°ã©ã ããã¯ãã©ã®ãããªåºåãå¾ãããã§ããããï¼ãï¼æ´æ°ã®ãµã¤ãºã4ã®å ´åãåºåã¯40ã§ã¯ããã¾ããï¼
#define SIZE 10 void size(int arr[SIZE]) { printf("size of array is:%d\n",sizeof(arr)); } int main() { int arr[SIZE]; size(arr); return 0; }
ä¸è¬çã«ã32bit OSã§ã¯size of array is:4ã¨ã64bit OSã§ã¯size of array is:8ã¨è¡¨ç¤ºããããè¦ããã«intåã®ãã¤ã³ã¿ã®å¤§ããã§ããã
颿°ã®ä»®å¼æ°ã§å®£è¨ããé
åã¯ããã¤ã³ã¿ã«å¤æããããã¤ã¾ãvoid size(int arr[SIZE])
ã¯void size(int *arr)
ã¨ç価ã§ããããã®ãããsizeof(arr)
ã¯intåã®ãã¤ã³ã¿ã®å¤§ãããè¿ãã
19
次ã®ããã°ã©ã ã¯ãã¨ã©ã¼ã表示ããããã«ãErrorã¨å¼ã°ãã颿°ãå©ç¨ããç°¡åãªCããã°ã©ã ã§ããErrorãå®ç¾©ããã¦ããæ¹æ³ã§ãèããããåé¡ã¯ã©ããªãã¨ã§ããããï¼
#include <stdlib.h> #include <stdio.h> void Error(char* s) { printf(s); return; } int main() { int *p; p = malloc(sizeof(int)); if(p == NULL) { Error("Could not allocate the memory\n"); Error("Quitting....\n"); exit(1); } else { /*some stuff to use p*/ } return 0; }
æãã¤ãåé¡ã¯4ã¤ã
1ã¤ç®ã¯ãã¨ã©ã¼ã¡ãã»ã¼ã¸ãprintf(3)ã®ç¬¬1弿°ã¨ãã¦å®è¡ãã¦ãããããæå³ããæ¸å¼æå®æååã¨è§£éããããã¡ãã»ã¼ã¸ã表示ããããã¨ãã¦ãã¾ã£ãæãããã°ã©ã ã®ç°å¸¸çµäºãå¼ãèµ·ãããªã©ã®åé¡ãèµ·ããå¯è½æ§ããããã¨ãç¹ã«ããããã°ç¨ã«å¤é¨ç±æ¥ã®ãã¼ã¿ã表示ãããããã«ä½¿ã£ã¦ãããªãã°ãæ¸å¼æå®æååã使ç¨ããæ»æãå¯è½ã¨ãªã£ã¦ãã¾ããé常ã«å±éºã§ããã
2ã¤ç®ã¯ãããã¯ããã°ã©ã ã®å 容ãä½¿ãæ¹æ¬¡ç¬¬ã ããæ¨æºåºåã¯ãããã¡ãªã³ã°ãè¡ã£ã¦ãããããError()ãå®è¡ãã¦ããå®éã«åºåãããã¾ã§ã«ã¿ã¤ã ã©ã°ãçºçããå¯è½æ§ããããã¨ãå³åº§ã«åºåããããªããfflush(3)ã使ãããsetbuf(3)/setvbut(3)ã§ãããã¡ãªã³ã°ãç¡å¹åãã¦ãããã¨ã
3ã¤ç®ã¯ãã¨ã©ã¼ã®åºåå ãæ¨æºåºåã§ãããã¨ãæ£å¸¸æã«æ¨æºåºåã«ä½ãããåºåããã®ãªãã°ãã¨ã©ã¼ã¡ãã»ã¼ã¸ã¯æ¨æºã¨ã©ã¼åºåã«åºåããã»ãããããã§ãªããã°ãæ£å¸¸ãªåºåã¨ã¨ã©ã¼ã¡ãã»ã¼ã¸ãæ··ãã£ã¦ãã¾ãã
4ã¤ç®ã¯ã弿°ã®åãchar *
ã§ãããã¨ãå®è¡æã«å¼æ°ã«æåå宿°ãæå®ããæãã³ã³ãã¤ã©ã«ãã£ã¦ã¯æ¯åº¦æ¯åº¦è¦åãã§ã¦ç
©ããããconst char *
ã«ãã¹ãã
ã¨ãã訳ã§ãä¸è¨å ¨ã¦ãè¸ã¾ãã¦ãæçµçã«ãç§ãªãããç´ãã
void Error(const char * const s) { assert(s != NULL); fprintf(stderr, "%s", s); return; }
void Error(const char * const s) { assert(s != NULL); fputs(s, stderr); return; }
20
Scanfscanfã使ã£ã次ã®2ã¤ã®é¢æ°ã®å¼ã³åºãã®éãã¯ä½ã§ããããï¼ãï¼2çªç®ã®é¢æ°ã®å¼ã³åºãã§ã¯ãã¹ãã¼ã¹ããããã¨ã«æ³¨æãã¾ããããã¹ãã¼ã¹ãåé¤ããã¨ãã®ããã°ã©ã ã®åãã観å¯ãã¦ã¿ã¦ãã ããï¼
#include <stdio.h> int main() { char c; scanf("%c",&c); printf("%c\n",c); scanf(" %c",&c); printf("%c\n",c); return 0; }
ã¾ãåæã¨ãã¦ãscanf(3)ã®å¤ææå®ã®å¤§åã«ããã¦ã¯ã夿ã«å ç«ã¡å é ã®ç©ºç½æåãèªã¿é£ã°ãï¼å¾ç¶ã®ç©ºç½æåã¯èªã¿é£ã°ããªãï¼ãç©ºç½æåã«ã¯ãåè§ã¹ãã¼ã¹ãã¿ã以å¤ã«ãæ¹è¡ãå«ã¾ããã
ãã ãä¾å¤ã¨ãã¦ãcã¨[ã«ããã¦ã¯å é ã®ç©ºç½æåã®èªã¿é£ã°ããè¡ããªãã
次ã«ãscanf(3)ã®ãã©ã¼ãããæååä¸ã«æ¸ãããç©ºç½æåã¯ãããã1æåã ãã§ãã£ã¦ãã1æå以ä¸ã®é£ç¶ããç©ºç½æåã®èªã¿é£ã°ããæå³ãããèªã¿é£ã°ããè¡ã£ãå¾ã«åå¨ãããç©ºç½æå以å¤ã®ä»»æã®æåãããã©ã¼ãããæååä¸ã®ç©ºç½æåã«ç¶ã夿æå®ã«ã¦èªã¿è¾¼ã¾ããæåã¨ãªãã
ä¸è¨ã«ãã¨ã¥ãã¦ãµã³ãã«ã³ã¼ããè§£éããã¨ãscanf("%c",&c);
ã¯ç©ºç½æåãå«ãä»»æã®1æåï¼1byteï¼ãèªã¿è¾¼ããscanf(" %c",&c);
ã¯0æå以ä¸ã®é£ç¶ããç©ºç½æåãèªã¿é£ã°ããå¾ã«åºç¾ããã ãããç©ºç½æåãé¤ãã®ä»»æã®1æåï¼1byteï¼ãèªã¿è¾¼ãã
21
次ã®Cããã°ã©ã ã§ãèããããåé¡ã¯ã©ããªãã¨ã§ããããï¼
#include <stdio.h> int main() { char str[80]; printf("Enter the string:"); scanf("%s",str); printf("You entered:%s\n",str); return 0; }
æãã¤ãåé¡ã¯2ã¤ã
1ã¤ç®ã¯ãé
åstrã®å¤§ãããè¶
ããå
¥åããã£ãå ´åã«ãããã¡ãªã¼ãã¼ããã¼ãèµ·ãããã¨ã対çã¨ãã¦ã¯scanf(3)ã®å¤ææå®ã«"%79s"
ã®ããã«ãã£ã¼ã«ãå¹
ã追å ãããã¨ãèããããããèªã¿è¾¼ããããªãã£ãæ®ãã®å
¥åãã©ãæ±ããã仿§ãæ¤è¨ããå¿
è¦ããããã¾ããUTF-8ã®ãããªå¯å¤é·ãªæåã³ã¼ãä½ç³»ãæ¡ç¨ãã¦ããå ´åãåç´ã«ãããã¡ã®å¤§ããã§å¶éããããã¨ããããã¡çµç«¯å´ã®æåã䏿£ãªå¤ã¨ãªãå¯è½æ§ãããã®ã§ãé©åãªåãè©°ãå¦çãè¡ãå¿
è¦ãããã ããã
2ã¤ç®ã¯ãä½ãå ¥åãããªãã£ãï¼ãããªãEOFã«å°éããï¼å ´åã«ãæªåæåã§ä¸å®å¤ãå ¥ã£ã¦ããç¶æ ã®ã¾ã¾ã®é åstrã®ä¸èº«ã表示ãããã¨ãã¦ãã¾ããã¨ãéãè¯ããã°ãéä¸ã§ãã«æåã¨è§£éããããå¤ã«ééãããã¨ãªãprintf(3)ã§è¡¨ç¤ºãç¶ãããã¨ãã¦ãã¾ããæ¬æ¥åç §ããã¹ãã§ãªãã¡ã¢ãªãåç §ãããã¨ãã¦ããã°ã©ã ãè½ã¡ãã ããããããéãæªããã°ãå¶ç¶ãã«æåã¨è§£éããããå¤ãé åstrã®å é è¦ç´ ã®ä¸å®å¤ã¨ãã¦åå¨ãã¦ãã¦ãåé¡ããããã¨ã«æ°ã¥ããªãã¾ã¾è¦éããã¦ãã¾ãã ããã
22
次ã®ããã°ã©ã ããã¯ãã©ã®ãããªåºåãå¾ãããã§ããããï¼
#include <stdio.h> int main() { int i; i = 10; printf("i : %d\n",i); printf("sizeof(i++) is: %d\n",sizeof(i++)); printf("i : %d\n",i); return 0; }
sizeof(int) == 4
ãæç«ããç°å¢ã ã¨ä»®å®ããã¨ããããªæãã
i : 10 sizeof(i++) is: 4 i : 10
sizeofæ¼ç®åã®ãªãã©ã³ãï¼è¢«æ¼ç®åï¼ã«è¨è¿°ããå¼ã¯ããã®åãå¯å¤é·é ååãªãã°è©ä¾¡ããããããã以å¤ã®åã®å ´åã¯è©ä¾¡ãããªãã
å¼ãè©ä¾¡ãããªãã¨ãããã¨ã¯ãå¼ã®è©ä¾¡ã«ãã£ã¦çããå¯ä½ç¨ãçºçããªããã¨ãããã¨ã ã
sizeof(i++)
ã®ãªãã©ã³ãã§ããiã¯å¯å¤é·é
ååã§ã¯ãªããããå¼ã®è©ä¾¡ã¯çºçããªãããã®ãããå¯ä½ç¨ã«ããã¤ã³ã¯ãªã¡ã³ãã¯èµ·ãããªãããã£ã¦ããã®å¼ã®åå¾ã«ã¦å¤æ°iã®å¤ã¯å¤åããªãã
23
次ã®ããã°ã©ã ã§ã¯ããªãè¦åãçºããããã®ã§ããããï¼ãï¼constãã¤ã³ã¿ãå¿ è¦ã¨ãã颿°ã«å¯¾ãã¦é常ã®ãã¤ã³ã¿ãéããã¨ã«ã¤ãã¦ãè¦åã¯çºãããã¾ããï¼
#include <stdio.h> void foo(const char **p) { } int main(int argc, char **argv) { foo(argv); return 0; }
ãã®åé¡ã§è©±é¡ã«ãã¦ããè¦åã¯ãããããchar **
ã¨const char **
ã®åãç°ãªãã¨ããææã ãããã¨æ¨æ¸¬ãã¦æ¸ãï¼è¦åèªä½ã¯ããã以å¤ã«2種é¡è¨3ã¤ã»ã©çºããããå¯è½æ§ããã*1ï¼ã
ã¨ãã£ã¦ããè¦åã®éãåãéãã ãã ã
char **
åã¯ãããï¼»charåã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãï¼½ãæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãããæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãããæå³ããã
䏿¹ãconst char **
åã¯ãããï¼»charåã®ãconstãªï¼å¤æ´ä¸å¯è½ãªï¼èªã¿è¾¼ã¿å°ç¨ãªï¼ãªãã¸ã§ã¯ãï¼½ãæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãããæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãããæå³ããã
注æãã¹ããªã®ã¯ãããã§å²ãã é¨åã«è¨è¿°ããåãåããªãè¦åã¯ã§ãªãããç°ãªãå ´åã«ã¯è¦åãã§ããã¨ãããã¨ã ã
- ï¼»charåã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãï¼½ãæã示ããã¤ã³ã¿å
- ï¼»charåã®ãconstãªï¼å¤æ´ä¸å¯è½ãªï¼èªã¿è¾¼ã¿å°ç¨ãªï¼ãªãã¸ã§ã¯ãï¼½ãæã示ããã¤ã³ã¿å
è¦ããã«ãã¤ã³ã¿åã¨ãã¦æã示ãå
ã®ãªãã¸ã§ã¯ãã®åãéããä¾ãããªãint *
ï¼ãintåã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãããæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãï¼ã¨unsigned int *
ï¼ãunsigned intåã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãããæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãï¼ãããã«éãã
char **
åã®ãªãã¸ã§ã¯ãã代å
¥ãã¦ãè¦åãããªãã®ã¯ãchar * const *
åãchar ** const
åãchar * const * const
åã§ããã
char * const *
åã¯ãããï¼»charåã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãï¼½ãæã示ããã¤ã³ã¿åã®ãconstãªï¼å¤æ´ä¸å¯è½ãªï¼èªã¿è¾¼ã¿å°ç¨ãªï¼ãªãã¸ã§ã¯ãããæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãããæå³ããã
char ** const
åã¯ãããï¼»charåã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãï¼½ãæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãããæã示ããã¤ã³ã¿åã®ãconstãªï¼å¤æ´ä¸å¯è½ãªï¼èªã¿è¾¼ã¿å°ç¨ãªï¼ãªãã¸ã§ã¯ãããæå³ããã
char * const * const
åã«ã¤ãã¦ã¯çç¥ããã
ãã®3ã¤ã¨ããããã§å²ãã é¨åã«è¨è¿°ããåã¯ãï¼»charåã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãï¼½ãæã示ããã¤ã³ã¿åãã«ãªããåãåãã§ãããããè¦åã¯ã§ãªãã
ã¡ãªã¿ã«ãããè¦ãããchar *
åã¨const char *
åã«ã¤ãã¦æ¸ããªãï¼
char *
åï¼ããcharåã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãããæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªãªãã¸ã§ã¯ããconst char *
åï¼ããcharåã®ãconstãªï¼å¤æ´ä¸å¯è½ãªï¼èªã¿è¾¼ã¿å°ç¨ãªï¼ãªãã¸ã§ã¯ãããæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãã
ããã§å²ãã é¨åã®åã¯ãã©ã¡ããcharåã§ããï¼ãªã®ã§è¦åã¯ã§ãªãï¼ã
ãªãããã®è§£çã¨ã¯å¥ã®è§£çãcomp.lang.cã®C FAQ 11.10ã«æ¸ããã¦ããã
24
次ã®ããã°ã©ã ããã¯ãã©ã®ãããªåºåãå¾ãããã§ããããï¼
#include <stdio.h> int main() { int i; i = 1,2,3; printf("i:%d\n",i); return 0; }
ç»é¢ã«i:1ã¨è¡¨ç¤ºãããã
ã¹ãã¼ãã¡ã³ãi = 1,2,3;
ã¯ãã³ã³ãæ¼ç®åã®åå¨ã¨ãåç´ä»£å
¥æ¼ç®åã®æ¹ãåªå
é ä½ãé«ããã¨ãããæ¬¡ã®3ã¤ã®å¼ãé çªã«è©ä¾¡ããããã®ããã«æ¯ãèãã
i = 1
2
3
ãã£ã¦å¤æ°iã«ã¯1ãä»£å ¥ãããã
ã¡ãªã¿ã«i = (1,2,3);
ã®å ´åã¯ãå¼1,2,3
å
ã®3ã¤ã®å¼ãå·¦ããé ã«è©ä¾¡ããå
é å´ã®å¼1
ã¨2
ã®è©ä¾¡çµæãæ¨ã¦ã¦ãæå¾ã®å¼3
ãè©ä¾¡ããçµæã§ããå¤3ãã夿°iã«ä»£å
¥ãããã
25
次ã®ããã°ã©ã ã¯ãéãã¼ã©ã³ãè¨ç®æ©ãå®è£ ããã³ã¼ãã®ä¸é¨ã§ãããã®ã³ã¼ãã«ã¯é大ãªãã°ãããã¾ãããããè¦ã¤ãã¦ãã ãããgetop颿°ã¯ãoperandsãopcodesãEOFãªã©ã«å¯¾ãã妥å½ãªæ»ãå¤ãè¿ãã¨æ³å®ãã¦ãã ããã
#include <stdio.h> #include <stdlib.h> #define MAX 80 #define NUMBER '0' int getop(char[]); void push(double); double pop(void); int main() { int type; char s[MAX]; while((type = getop(s)) != EOF) { switch(type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '*': push(pop() * pop()); break; case '-': push(pop() - pop()); break; case '/': push(pop() / pop()); break; /* ... * ... * ... */ } } }
æãã¤ãåé¡ã¯3ã¤ãæå¾ã®1ã¤ã¯ä½åãããããªããã
1ã¤ç®ã¯ãæ¼ç®åãããæã«push(pop() + pop());
ã®ããã«é¢æ°pop()ã2åå®è¡ãã¦ããããpop()ãå¼ã³åºãããé çªãä¸å®ã§ãããã¨ï¼ã¤ã¾ããå·¦ããå³ã®é ã«å¼ã°ãããããããªãããå³ããå·¦ã®é ã«å¼ã°ãããããããªããã¨ãããã¨ï¼ãæ¸ç®ãé¤ç®ã«ã¦èª¤ã£ãçµæãå¾ããã¦ãã¾ãå±éºãããã
2ã¤ç®ã¯ãé¤ç®ã®æã«é¤æ°ã0ã ã£ãå ´åï¼ã¼ãé¤ç®ï¼ã®ãã¨ãèãã¦ããªããã¨ã
3ã¤ç®ã¯ãã¹ã¿ãã¯ã空ã®ç¶æ ã§pop()ãå¼ã°ãããããªã±ã¼ã¹ãæ³å®ãã¦ããªããã¨ã
26
次ã®ããã°ã©ã ã¯ãã»ã¨ãã©ã®UNIXç³»ã·ã¹ãã ã§ä½¿ç¨ããã¦ããbannerã³ãã³ãã®æå°çãå®è£ ããç°¡åãªããã°ã©ã ã§ããããã°ã©ã ã§ä½¿ç¨ããã¦ãããã¸ãã¯ãæãã¦ãã ããã
#include<stdio.h> #include<ctype.h> char t[]={ 0,0,0,0,0,0,12,18,33,63, 33,33,62,32,62,33,33,62,30,33, 32,32,33,30,62,33,33,33,33,62, 63,32,62,32,32,63,63,32,62,32, 32,32,30,33,32,39,33,30,33,33, 63,33,33,33,4,4,4,4,4,4, 1,1,1,1,33,30,33,34,60,36, 34,33,32,32,32,32,32,63,33,51, 45,33,33,33,33,49,41,37,35,33, 30,33,33,33,33,30,62,33,33,62, 32,32,30,33,33,37,34,29,62,33, 33,62,34,33,30,32,30,1,33,30, 31,4,4,4,4,4,33,33,33,33, 33,30,33,33,33,33,18,12,33,33, 33,45,51,33,33,18,12,12,18,33, 17,10,4,4,4,4,63,2,4,8, 16,63 }; int main(int argc,char** argv) { int r,pr; for(r=0;r<6;++r) { char *p=argv[1]; while(pr&&*p) { int o=(toupper(*p++)-'A')*6+6+r; o=(o<0||o>=sizeof(t))?0:o; for(pr=5;pr>=-1;--pr) { printf("%c",( ( (pr>=0) && (t[o]&(1<<pr)))?'#':' ')); } } printf("\n"); } return 0; }
ï¼å
ã«æ¸ãã¦ããã¨ãwhile(pr&&*p)
ã¯ééããæ£ããã¯while(p&&*p)
ãåæç±æ¥ã®ãã°ã ãï¼
ãã®ããã°ã©ã ã¯ãã¢ã«ãã¡ããããå ¨ã¦å¤§æåã«å¤æããä¸ã§ãã³ã³ã½ã¼ã«ä¸ã«6Ã6ã®å¤§ããã§è¡¨ç¤ºãããã¢ã«ãã¡ããã以å¤ã¯ç©ºç½ã¨ãã¦æ±ãããã
$ ./a.out abc ## ##### #### # # # # # # # ##### # ###### # # # # # # # # # # # ##### #### $ ./a.out a1c ## #### # # # # # # # ###### # # # # # # # #### $ _
Bã®å¤æããå¾®å¦ã«ééã£ã¦ããæ°ãããã
é åtã¯è±å¤§æåã®6Ã6ã®ããããæå³ãããããéåã ãt[0]ããt[5]ã¯ç©ºç½ã表示ããããã®ãã¼ã¿ã§ãt[6]ããt[11]ãAã§ã以éBãCâ¦â¦ã¨ããå ·åã«ç¶ãã¦ãããåèã¾ã§ã«ãAã»Bã»Cã®ãã¼ã¿ã®æã¡æ¹ã¯ããããªæãã
t[ 6] | 12 | 0b001100 | 11 | t[ 7] | 18 | 0b010010 | 1 1 | t[ 8] | 33 | 0b100001 | 1 1 | t[ 9] | 63 | 0b111111 | 111111 | t[10] | 33 | 0b100001 | 1 1 | t[11] | 33 | 0b100001 | 1 1 | t[12] | 62 | 0b111110 | 11111 | t[13] | 32 | 0b100000 | 1 | t[14] | 62 | 0b111110 | 11111 | t[15] | 33 | 0b100001 | 1 1 | t[16] | 33 | 0b100001 | 1 1 | t[17] | 62 | 0b111110 | 11111 | t[18] | 30 | 0b011110 | 1111 | t[19] | 33 | 0b100001 | 1 1 | t[20] | 32 | 0b100000 | 1 | t[21] | 32 | 0b100000 | 1 | t[22] | 33 | 0b100001 | 1 1 | t[23] | 30 | 0b011110 | 1111 |
åè¦ç´ ã®ä¸ä½6bitã«ã¤ãã¦ã1bitã1dotã¨ãã¦ãæç»ãããªã1ããæç»ããªããªã0ãä¿æãã¦ããã6Ã6ãªã®ã§ãé åã®è¦ç´ 6åã§1æååã®ãã¼ã¿ã¨ãªãã
ââã¨ããããªæãã«ãã¼ã¿æ§é ã«ã¤ãã¦èª¬æããæç¹ã§ãã¹ãã¼ãã¡ã³ãã»ã¬ãã«ã®ç´°ãã説æã¾ã§ããªãã¦ãååãªæ°ããã¦ãããã ã£ã¦ããããè¦ãã°ï¼ããã¦ããã®ãã¼ã¿æ§é ã念é ã«ãã³ã¼ããèªãã°ï¼ãä½ã¨ãªãåããã§ãããï¼
ããã¦ãããªããwhileã«ã¼ãã®ä¸ã®forã«ã¼ãã¯ã6Ã6ã®ãããã®æ¨ªæ¹åï¼å·¦ããå³ï¼ã®ããããã®å¦çã«ãªããã6åã§ã¯ãªã7åã«ã¼ããã¦ãããæå¾ã®ã«ã¼ãã§ã¯å¿ ã空ç½ãåºåããããããã«ãã£ã¦ãæ¬¡ã«æç»ããæåã¨ã®éã«å¿ ã1ãããåã®ç©ºç½ãå ¥ããã¨ã«ãªãã
27
次ã®ããã°ã©ã ããã¯ãã©ã®ãããªåºåãå¾ãããã§ããããï¼
#include <stdio.h> #include <stdlib.h> #define SIZEOF(arr) (sizeof(arr)/sizeof(arr[0])) #define PrintInt(expr) printf("%s:%d\n",#expr,(expr)) int main() { /* The powers of 10 */ int pot[] = { 0001, 0010, 0100, 1000 }; int i; for(i=0;i<SIZEOF(pot);i++) PrintInt(pot[i]); return 0; }
ãããªæãã
pot[i]:1 pot[i]:8 pot[i]:64 pot[i]:1000
0001
ã0010
ã0100
ã¯ã0ã§å§ã¾ã宿°ãªã®ã§ã8鲿°ã¨ãã¦è§£éãããã10鲿°ã«å¤æããã¨ã0010
ã¯8ã«ã0100
ã¯64ã«ãªãã
28
29
次ã®ããã°ã©ã ããã¯ãã©ã®ãããªåºåãå¾ãããã§ããããï¼ãï¼10ã§ã¯ããã¾ããï¼
#include <stdio.h> #define PrintInt(expr) printf("%s : %d\n",#expr,(expr)) int main() { int y = 100; int *p; p = malloc(sizeof(int)); *p = 10; y = y/*p; /*dividing y by *p */; PrintInt(y); return 0; }
ç»é¢ã«y : 100ã¨è¡¨ç¤ºãããã
y/*p
ã¨ãèå¥åã®éã«ã¹ãã¼ã¹ãå
¥ããªãã£ãã®ãæå ãã³ã¡ã³ãã®éå§ï¼/*ï¼ã¨è§£éããã¦ãã¾ã£ãçµæãy = y/*p; /*dividing y by *p */;
ã¨ããã¹ãã¼ãã¡ã³ãã¯ãã³ã¡ã³ãé¨åãé¤ãã¨y = y;
ã¨ãªãã
ã¾ãããã®æã®åé¡ã¯ã·ã³ã¿ãã¯ã¹ã»ãã¤ã©ã¤ãæ©è½ãæã¤ããã¹ãã¨ãã£ã¿ã使ç¨ãã¦ããã°æ°ã¥ãããããã³ã³ãã¤ã©ã®è¦åã¬ãã«ãè¦åå å®¹ãæ°ã«ãã人ããæ°ã¥ãå¯è½æ§ã¯é«ãã ããã
#include <stdio.h> #define PrintInt(expr) printf("%s : %d\n",#expr,(expr)) int main() { int y = 100; int *p; p = malloc(sizeof(int)); *p = 10; y = y/*p; /*dividing y by *p */; PrintInt(y); return 0; }
30
次ã®ããã°ã©ã ã¯ãæ¥ä»ãèªã¿è¾¼ãã ããåºåãããããããã®ç°¡åãªCããã°ã©ã ã§ãããããå®è¡ãã¦ããã®æ¯ãèãã説æãã¦ãã ããã
#include <stdio.h> int main() { int day,month,year; printf("Enter the date (dd-mm-yyyy) format including -'s:"); scanf("%d-%d-%d",&day,&month,&year); printf("The date you have entered is %d-%d-%d\n",day,month,year); return 0; }
ãæ¯ãèãã説æãã¦ãã ãããã¨ãã£ã¦ããä½ãç¹å¥ãªç¹ã¯ãªãæ°ããããâ¦â¦ã
ãã®ããã°ã©ã ã¯31-12-2015ã®ãããªå½¢å¼ã§ã®æ¥ä»å ¥åãæå¾ ããå ¥åãã¼ã¿ããå¹´ã»æã»æ¥ãintåã§åå¥ã«åãåºããåã³åããããªå½¢å¼ã§åºåããã
ãã ãå ¥åå¤ã®æ¡æ°ãå¶éãã¦ããªããããä¾ãã°2015-120-31ã許容ãã¦ãã¾ããã¾ãè² ã®æ´æ°ã許容ãã¦ãã¾ãããã-31--12--2015ãOKã ã£ããããã
ãã¨scanf(3)ã®æ¸å¼æå®ã¯ãcã¨[以å¤ã§ã¯ã夿ã«å ç«ã¡å é ã®é£ç¶ããç©ºç½æåãèªã¿é£ã°ãã®ã§ã 31- 12- 2015ã -31- -12- -2015ã許容ããã
éä¸ã¾ã§ããï¼ã¾ãã¯å ¨ãä½ãï¼å¤æã§ããªãã£ãå ´åã¸ã®å¯¾å¿ãããã¦ããªãããã®å ´åã夿°dayãmonthãyearã®ãã¡å¤æã§ããªãã£ãé ç®ãåå¾ããäºå®ã ã£ããã®ã«ã¯ä½ãä»£å ¥ãããªãããããã®å¤æ°ã¯åæåãããã¦ããªãã®ã§ãæå¾ã®printf(3)ã«ã¦ã´ãã®å¤ã表示ããã¦ãã¾ãã
ç©ºç½æåã®ä»¶ãé¤ãã°ãscanf(3)ã®æ¸å¼æå®ã¨ãã¦"%2u-%2u-%4u"
ãç¨ãã¦ãå¹´ã»æã»æ¥ãunsigned intåã§åãåºãããã«ããä¸ã§ãscanf(3)ã®æ»ãå¤ããã§ãã¯ããã°ãããå°ãå³å¯ãªå¤å®ã¨ãªãã ããã
31
次ã®ããã°ã©ã ã¯ãæ´æ°ãèªã¿è¾¼ãã ããåºåãããããããã®ç°¡åãªCããã°ã©ã ã§ããããããæ£ããåãã¾ãããåé¡ãè¦ã¤ãã¦ãã ããã
#include <stdio.h> int main() { int n; printf("Enter a number:\n"); scanf("%d\n",n); printf("You entered %d \n",n); return 0; }
scanf()ã®ä½¿ãæ¹ãééã£ã¦ãããscanf("%d\n",&n);
ãæ£ããã
32
次ã®ããã°ã©ã ã¯ããããæ¼ç®åã使ã£ã¦æ´æ°ã5åã«ãããç°¡åãªCããã°ã©ã ã§ãããããã5åã«ãªãã¾ãããããã°ã©ã ã誤ã£ãæ¯ãèãããã¦ãã¾ãçç±ã説æãã¦ãã ããã
#include <stdio.h> #define PrintInt(expr) printf("%s : %d\n",#expr,(expr)) int FiveTimes(int a) { int t; t = a<<2 + a; return t; } int main() { int a = 1, b = 2,c = 3; PrintInt(FiveTimes(a)); PrintInt(FiveTimes(b)); PrintInt(FiveTimes(c)); return 0; }
ã·ããæ¼ç®åããã+æ¼ç®åã®æ¹ãåªå
é ä½ãé«ããããa<<2 + a
ã¯a<<(2 + a)
ã¨ãã風ã«è©ä¾¡ããã¦ãã¾ãã(a<<2) + a
ã¨ããé¢¨ã«æ¬å¼§ãä»ãå ãããã¨ã
33
次ã®ããã°ã©ã ã¯ãæ£ããåãã§ããããï¼
#include <stdio.h> #define PrintInt(expr) printf("%s : %d\n",#expr,(expr)) int max(int x, int y) { (x > y) ? return x : return y; } int main() { int a = 10, b = 20; PrintInt(a); PrintInt(b); PrintInt(max(a,b)); }
ã³ã³ãã¤ã«ããéããªãï¼ã¯ãï¼ã
(x > y) ? return x : return y;
ãreturn (x > y) ? x : y;
ã«æ¸ãç´ããã¨ãä¸é
æ¼ç®åã¯ããã¾ã§ãæ¼ç®åã§ãããifã®ãããªå¶å¾¡æ§æã§ã¯ãªãããªã®ã§ææ³çã«ãå¼ãåãè¾¼ããã¨ã¯å¯è½ã ããã¹ãã¼ãã¡ã³ãï¼æï¼ãåãè¾¼ããã¨ã¯ã§ããªãã
34
次ã®ããã°ã©ã ã¯ããã¤ãã¹è¨å·ã20ååºåããããã«æç¤ºããCã³ã¼ãã®ä¸é¨ã§ãããåããã ã¨æãã¾ãããããã§ã¯åãã¾ããã
#include <stdio.h> int main() { int i; int n = 20; for( i = 0; i < n; i-- ) printf("-"); return 0; }
ãã®ã³ã¼ããä¿®æ£ããã®ã¯ã¨ã¦ãç°¡åã§ããåé¡ãé¢ç½ããªãããã«ããããããã¨æãã¾ãã1æåã ãå¤ãã¦ãã®ã³ã¼ããä¿®æ£ãã¦ã¿ã¦ãã ãããçãã¯3ã¤ããã¾ãããã¦ããã¹ã¦çãããã¾ããï¼
è§£çãã®ï¼ï¼å¤æ°nããã¯ãªã¡ã³ãããã
#include <stdio.h> int main() { int i; int n = 20; for( i = 0; i < n; n-- ) printf("-"); return 0; }
ããã¯åãããããã
è§£çãã®ï¼ï¼foræã®ç¶ç¶æ¡ä»¶ã-i < n
ã«ããã
#include <stdio.h> int main() { int i; int n = 20; for( i = 0; -i < n; i-- ) printf("-"); return 0; }
ãããåããããããããåé
æ¼ç®å-
ã§å¤æ°iã®ç¬¦å·ãå転ããããã¨ã§ããã¯ãªã¡ã³ãã§è² ã®å¤ã«ãªã£ã¦ããiãç¶ç¶æ¡ä»¶ã§ã¯æ£ã®å¤ã¨ã¿ãªããããã¤ã¾ãç¶ç¶æ¡ä»¶ã§ã®æ¯è¼æ¼ç®ã«ããã¦ã¯ãå®è³ªçã«iãã¤ã³ã¯ãªã¡ã³ãããã¦ããã«çããã
è§£çãã®ï¼ï¼foræã®ç¶ç¶æ¡ä»¶ãi + n
ã«ããã
#include <stdio.h> int main() { int i; int n = 20; for( i = 0; i + n; i-- ) printf("-"); return 0; }
iããã¯ãªã¡ã³ãããã¦ããã¨ãæçµçã«i + n
ã-20 + 20
ã¨ãªããè©ä¾¡çµæã0ã«ãªã£ã¦foræãçµäºããã
è§£çãã®ï¼ï¼foræã®ç¶ç¶æ¡ä»¶ã~i < n
ã«ããããã ã1ã®è£æ°ã§è² ã®å¤ã表ç¾ãã¦ããç°å¢éå®ãã¾ãããããªç°å¢ã«åºãããããã¨ã¯ãªãã®ã ãâ¦â¦Cè¨èªã®è¦æ ¼ã§ã¯è² ã®å¤ãã©ã表ç¾ãããã«ã¤ãã¦ã®å®ç¾©ããã¦ããªã訳ã§ãPDP-1ã®ãããªå¤ãã³ã³ãã¥ã¼ã¿*2ãªããããããããâ¦â¦ã
#include <stdio.h> int main(void) { int i; int n = 20; for( i = 0; ~i < n; i-- ) printf("-"); return 0; }
1ã®è£æ°ãæ¡ç¨ãã¦ããç°å¢ã§iããããå転ãããï¼1ã®è£æ°ã«å¤æããï¼ã¨ã-1ã1ã«ã-2ã2ã«ãªããã¤ã¾ããæçµçã«~i < n
ã¯20 < 20
ã¨ãªããè©ä¾¡çµæã0ã«ãªã£ã¦foræãçµäºããã
ãªããæ®å¿µãªãã2ã®è£æ°ãæ¡ç¨ãã¦ããç°å¢ã§ã¯ããããå転ããããã¨ã§ã-1ã0ã«ã-2ã1ã«ãã¨ãã風ã«ãªããçµæã¨ãã¦ãã¤ãã¹è¨å·ã21ååºåããã¦ãã¾ããç¾å¨ã®ã³ã³ãã¥ã¼ã¿ã®å¤§åã§ã¯2ã®è£æ°ãæ¡ç¨ããã¦ããã®ã§ãã¤ã¾ããã®è§£çã¯å¤§æµã®ç°å¢ã§ã¯æ£ããåä½ããªãã
35
次ã®ã³ã¼ãã¯ä½ãééã£ã¦ããã®ã§ããããï¼
#include <stdio.h> int main() { int* ptr1,ptr2; ptr1 = malloc(sizeof(int)); ptr2 = ptr1; *ptr2 = 10; return 0; }
夿°ptr2ã¯intåã§ãããintåã®ãã¤ã³ã¿ã§ã¯ãªãããã®ããããªãã¡ã¬ã³ã¹ã§ããªãããã¤ã³ã¿ã¨ãã¦å®£è¨ããããªãã°ãint *ptr1, *ptr2;
ãint* ptr1; int* ptr2;
ãªã©ã®ããã«å®£è¨ãããã¨ã
36
次ã®ããã°ã©ã ããã¯ã©ã®ãããªåºåãå¾ãããã§ããããï¼
#include <stdio.h> int main() { int cnt = 5, a; do { a /= cnt; } while (cnt --); printf ("%d\n", a); return 0; }
夿°aã®å¤ã表示ãããåã«ãa /= cnt;
ã«ã¦ã¼ãé¤ç®ãçºçãããã«ã¼ãã®æå¾ã®é±ã«ã¦ã夿°cntã®å¤ã0ã«ãªã£ã¦ããããã§ããã
37
次ã®ããã°ã©ã ããã¯ã©ã®ãããªåºåãå¾ãããã§ããããï¼
#include <stdio.h> int main() { int i = 6; if( ((++i < 7) && ( i++/6)) || (++i <= 9)) ; printf("%d\n",i); return 0; }
ç»é¢ã«8ã¨è¡¨ç¤ºãããã
ifæã®æ¡ä»¶å¼ã«ã¦ãã¾ã++i < 7
ãè©ä¾¡ããã7 < 7
ã§å½ã¨ãªããæ¬¡ã«ãè«çæ¼ç®åã®ç絡è©ä¾¡ããã++i <= 9
ãè©ä¾¡ããã8 <= 9
ã§çã¨ãªãã++i
ã2åå®è¡ããããããåæå¤ã®6ãã2å¢å ãã8ã«ãªãã
ãªãè«çANDæ¼ç®åãè«çORæ¼ç®åã¯å¯ä½ç¨å®äºç¹ã§ãããããä¸è¨ã³ã¼ãã¯å¯ä½ç¨ãè¤æ°åçºçããæªå®ç¾©ã®ã³ã¼ãã«ã¯è©²å½ããªãã
38
次ã®ããã°ã©ã ã«å«ã¾ãããã°ã¯ä½ã§ããããï¼
#include <stdlib.h> #include <stdio.h> #define SIZE 15 int main() { int *a, i; a = malloc(SIZE*sizeof(int)); for (i=0; i<SIZE; i++) *(a + i) = i * i; for (i=0; i<SIZE; i++) printf("%d\n", *a++); free(a); return 0; }
free(a);
ãNGãç´åã®forã«ã¼ãã«ã¦ãã¤ã³ã¿aãã¤ã³ã¯ãªã¡ã³ããã¦ãããããæ¬æ¥free(3)ããæã«æå®ããã¹ãã¢ãã¬ã¹ããintå夿°15ååã»ã©é¢ããå ´æãæå®ãã¦free(3)ãã¦ãã¾ã£ã¦ããã
39
次ã®Cããã°ã©ã ã¯æ£ããåãã§ããããï¼ãããåãå ´åãã©ã®ãããªåºåãå¾ãããã§ããããï¼
#include <stdio.h> int main() { int a=3, b = 5; printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]); printf(&a["WHAT%c%c%c %c%c %c !\n"], 1["this"], 2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]); return 0; }
éå¸¸ã«æ®å¿µãªãããCè¨èªã®ææ³ã¨ãã¦åæ³ãªããã°ã©ã ã§ãã³ã³ãã¤ã«ãå®è¡ãå¯è½ã§ããã
ã¡ãªã¿ã«å®è¡ããã¨ãããªæãã
Hello! how is this? super That is C !
ä¸è¨ã®ã³ã¼ãã¯ã次ã®ã³ã¼ãã¨ã ãããåãã ã
#include <stdio.h> int main() { int a=3, b = 5; printf(&"Ya!Hello! how is this? %s\n"[a], &"junk/super"[b]); printf(&"WHAT%c%c%c %c%c %c !\n"[a], "this"[1], "beauty"[2],"tool"[0],"is"[0],"sensitive"[3],"CCCCCC"[4]); return 0; }
Cè¨èªã®é åã®æ·»åæ¼ç®å[]ã®ãªãã©ã³ãã¯äº¤æå¯è½ã§ãããããX[Y]ãY[X]ã¨è¨è¿°ãããã¨ãå¯è½ã ãå¯è½ã ããããããIOCCCãã¿ã«ãªããããã ã
ãã®è¾ºã®ãã¨ãããå°ã詳ããç¥ããããªããcomp.lang.cã®C FAQ 6.11ãåç §ãããã¨ã
40
次ã®ããã°ã©ã ã§ãLife is beautifulã¨å ¥åããå ´åãã©ã®ãããªåºåãå¾ãããã§ããããï¼
#include <stdio.h> int main() { char dummy[80]; printf("Enter a string:\n"); scanf("%[^a]",dummy); printf("%s\n",dummy); return 0; }
ç»é¢ã«Life is beã¨è¡¨ç¤ºãããã
[
ã¯scanf(3)ã®æ¸å¼æå®ã®1ã¤ã§ã[]ã§å²ãã ä¸ã«è¨è¿°ããæåã®éåãèªã¿è¾¼ãããåè¿°ã®ã³ã¼ãã®ããã«[^]
ã¨ããå ´åã«ã¯ä¸ã«è¨è¿°ããæå以å¤ã®éåãèªã¿è¾¼ãã
ã¤ã¾ãã"%[^a]"
ã¯ãa以å¤ã®æåã®éåãèªã¿è¾¼ããã¨ããæå³ã¨ãªãããLife is beautifulãã®å
é ããå§ã¾ããa以å¤ã®æåã®éåââå
é ãããaãåºç¾ããç´åã®æåã¾ã§ãèªã¿è¾¼ã¾ãããã¨ã«ãªãã
41
æ³¨è¨ ï¼ããã¯Cè¨èªã¨ããããããªã³ã«ã«é¢é£ããåé¡ã§ãã
次ã®ãããªa.cãb.cãmain.cã¨ãã3ã¤ã®ãã¡ã¤ã«ãããã¨ãã¾ãã
a.c
int a;
b.c
int a = 10;
main.c
extern int a; int main() { printf("a = %d\n",a); return 0; }
ãããã®ãã¡ã¤ã«ãä¸ç·ã«ã³ã³ãã¤ã«ããã¨ã©ããªããè¦ã¦ã¿ã¾ãããã
bash$ gcc a.c b.c main.c bash$ ./a.out a = 10
ãã¼ãã
ãªã³ã«ã¨ã©ã¼ãçºçãã¦ã³ã³ãã¤ã«ã§ãã¾ããï¼ããªãã§ããããï¼
åæããHmm!! no compilation/linker error!!! Why is it so??ããªã®ã§ããã³ã³ãã¤ã«ã¨ã©ã¼ããªã³ã«ã¨ã©ã¼ãèµ·ããªããï¼ããªãã§ï¼ãã¨ããæãã ã¨æãããã
å¤é¨å¤æ°ã®å®ç¾©åºç¾ã¨åç
§åºç¾ã ããè¦æ ¼Cçã«ã¯ãa.cã®int a;
ã¯åç
§ã¨ã¿ãªãããb.cã®int a = 10;
ã¯å®ç¾©ã¨ã¿ãªãããmain.cã®extern int a;
ã¯åç
§ã¨ã¿ãªããããã¤ã¾ãå®ç¾©ã1ã¶æã¨è§£éããããããä½ã®åé¡ããªãã
ã¡ãªã¿ã«ãå¤é¨å¤æ°ã®å®ç¾©åºç¾ã¨åç §åºç¾ã®åºå¥ã«ã¤ãã¦ãè¦æ ¼Cã®ã¢ãã«ã¨ãå®éã«ã³ã³ãã¤ã©ãæ¡ç¨ãã¦ããã¢ãã«ã¯ç°ãªããã³ã³ãã¤ã©ãæ¡ç¨ãã¦ããã¢ãã«ã«ã¯ä»¥ä¸ã®4種é¡ãããã
- åæååã¢ãã«
- è¨æ¶åã¯ã©ã¹çç¥ã¢ãã«
- COMMONã¢ãã«
- æè¡·COMMONã¢ãã«
ããåãããªãããå¤ågccã¯ä¸è¨3ãªãã4ãæ¡ç¨ãã¦ããã¨æãããããã®2ã¢ãã«ã¯è¦æ ¼Cã®ã¢ãã«ã«è¿ããããå ã«æ¸ããè¦æ ¼Cã®ã¢ãã«ã«åºã¥ãè§£éã¨åæ§ã®çµæã¨ãªã£ãã¨æãããã
èè¶³ã ããC++ã¯è¨æ¶åã¯ã©ã¹çç¥ã¢ãã«ãæ¡ç¨ãã¦ãããè¨æ¶åã¯ã©ã¹çç¥ã¢ãã«ã§ã¯ãa.cã®int a;
ã¨b.cã®int a = 10;
ã®ä¸¡æ¹ã¨ãå®ç¾©ã¨è¦ãªãããããããªã³ã¯æã«å¤æ°aã®å¤éå®ç¾©ã§ã¨ã©ã¼ã¨ãªãã
42
次ã®ãã¯ãã¯ãªãã»ãããè¿ãããã«ããã使ããã¦ãããã®ã§ãããã®ãã¯ãã®å¦çå 容ã¨ãããã使ç¨ããã¡ãªãããæãã¦ãã ããã
#define offsetof(a,b) ((int)(&(((a*)(0))->b)))
Cè¨èªã®æ¨æºã©ã¤ãã©ãªstddef.hã«å®ç¾©ããã¦ãããã¯ãoffsetofã¨ã»ã¼åçã§ããããã¯ãã®ä¸èº«èªä½ã¯ãå¦çç³»ã«ãã£ã¦ç°ãªãï¼ãããããªãï¼ãâ¦â¦ããã¨ãæ¨æºã©ã¤ãã©ãªã®æ¹ã§ã¯size_tåã®å¤ãè¿ãå¼ã«å±éããããã¨ã«ãªã£ã¦ãããããã®ãµã³ãã«ã³ã¼ãã§ã¯intåã«ãªãã
ä½ããããã¯ããã¨ããã¨ãæ§é ä½ã®ã¡ã³ãã®ãªãã»ããï¼æ§é ä½ã®å é ã¢ãã¬ã¹ããä½byteé¢ããä½ç½®ã«ãããï¼ï¼ãããã®æ§é ä½ã®å¤æ°ãå®éã«å®ç¾©ãã¦ã¢ãã¬ã¹å¤ããè¨ç®ãããã¨ãªãæ±ãããã®ã ï¼ãã ãããããã£ã¼ã«ããé¤ãï¼ã
ä½¿ãæ¹ã®ä¾ï¼
#include <stddef.h> #include <stdio.h> int main(void) { struct st { char a; short b; int c; double d; char e; char f; long g; }; printf("%u\n", (unsigned) offsetof(struct st, a)); printf("%u\n", (unsigned) offsetof(struct st, b)); printf("%u\n", (unsigned) offsetof(struct st, c)); printf("%u\n", (unsigned) offsetof(struct st, d)); printf("%u\n", (unsigned) offsetof(struct st, e)); printf("%u\n", (unsigned) offsetof(struct st, f)); printf("%u\n", (unsigned) offsetof(struct st, g)); return 0; }
Ubuntu 12.04.5 LTSï¼32bitï¼ã§ã®å®è¡ä¾ã
$ uname -a Linux fabrico 3.2.0-88-generic-pae #126-Ubuntu SMP Mon Jul 6 21:47:47 UTC 2015 i686 i686 i386 GNU/Linux $ ./a.out 0 2 4 8 16 17 20 $ _
æ§é ä½ã®ã¡ã³ãã¯ãã¡ã¢ãªä¸ã«ééãªãè©°ãè¾¼ã¾ãã¦ã¯ããªãï¼å¦çç³»ä¾åã®æã使ãã°å¥ã ãï¼ã大æµã¯ãCPUãå¹ççãã¤ä½ã®åé¡ããªãã¡ã¢ãªã¢ã¯ã»ã¹ã§ããããã«é ç½®ããããããééãåå¨ãã¦ãããæ£ãããªãã»ãããç¥ããããªããoffsetofã使ãã¹ãã ããã
43
次ã®ã³ã¼ãã¯æåãªTriple xor swapã®ãã¯ãå®è£ ã§ãã
#define SWAP(a,b) ((a) ^= (b) ^= (a) ^= (b))
ä¸è¨ã®ãã¯ãã§ã¯ã©ã®ãããªåé¡ãèµ·ããå¾ãã§ããããï¼
å¯ä½ç¨å®äºç¹ã«å°éããã¾ã§ã«ãåä¸ã®ãªãã¸ã§ã¯ãã«å¯¾ãã¦å¯ä½ç¨ãè¤æ°åçºçãããè¦æ ¼Cçã«æªå®ç¾©ã®ã³ã¼ãã«å±éããããããä½ãèµ·ãããåãããªãââã¤ã¾ããã©ã®ãããªåé¡ãçºçãã¦ããããããªããå±éºãªã³ã¼ãã§ããã
44
次ã®ãã¯ãã®ç¨éã¯ä½ã§ããããï¼
#define DPRINTF(x) printf("%s:%d\n",#x,x)
ã·ã³ãã«ï¼å¤æ°ï¼ãã¯ã宿°ï¼åæåï¼intåãè¿ã颿°å¼ã³åºãï¼ã®ååã¨å¤ãæ¨æºåºåã«åºåããããã¯ãåã®éããããã°åãããããã½ã¼ã¹ãããã¬ã使ããªãå ´ååãã§ããã
45
IAddOverFlowã¨ãã颿°ã®ã³ã¼ãã£ã³ã°ãä¾é ¼ãããã¨ãã¾ãããããã®é¢æ°ã¯ãçµæãæ ¼ç´ããæ´æ°å夿°ã¸ã®ãã¤ã³ã¿1ã¤ã¨ãå ç®ããæ´æ°2ã¤ãåè¨3ã¤ã®ãã©ã¡ã¼ã¿ãåãã¾ããæ»ãå¤ã¯ããªã¼ãã¼ããã¼ãããã°0ããªããã°1ã¨ãã¾ãã
int IAddOverFlow(int* result,int a,int b) { /* ... */ }
ããªããªãä¸è¨ã®é¢æ°ãã©ãã³ã¼ãã£ã³ã°ãã¾ããï¼ãï¼è¦ã¯ãªã¼ãã¼ããã¼ã®æ¤ç¥ã«ãã©ã®ãããªãã¸ãã¯ã使ããã¨ãã質åã§ãï¼
ã¢ã³ãã¼ããã¼ã®ãã¨ãèæ ®ããã¹ãã ãããï¼
è¦æ ¼Cçã«ã¯ç¬¦å·ä»ãæ´æ°ã®ãªã¼ãã¼ããã¼ã¯æªå®ç¾©ã®åä½ãªã®ã§ããªã¼ãã¼ããã¼ãçºçãããã¨ãæ¤ç¥ããã®ã§ã¯ãªãããªã¼ãã¼ããã¼ãçºçããå¯è½æ§ãæ¤ç¥ãã¹ãã ããã
ãã£ã¦ãä¾ãã°ãããªæãã ãããã
int IAddOverFlow(int* result,int a,int b) { assert(result != NULL); if (((a > 0) && ((INT_MAX - a) < b)) || ((a < 0) && ((INT_MIN - a) > b))) { /* ãªã¼ãã¼ããã¼ï¼ã¢ã³ãã¼ããã¼ããããªã®ã§å ç®ããªã */ return 0; } *result = a + b; return 1; }
æªå®ç¾©ã®åä½ãåé¿ããç®çãããããããªã¼ãã¼ããã¼ï¼ã¢ã³ãã¼ããã¼ãçºçããå¯è½æ§ãããå ´åã¯ãå ç®å¦çãããªãããã®ãããè¨ç®çµæãè¿ããªãã¨ããããè¿ããã¨ãã§ããªãã
46
次ã®ãã¯ãã®å½¹å²ã¯ä½ã§ããããï¼
#define ROUNDUP(x,n) ((x+n-1)&(~(n-1)))
2鲿°ã®åãä¸ãå¦çãè¡ããä¾ãã°ãããªæãã
ROUNDUP(0x24, 0x01) == 0x24 | ROUNDUP(0b0010_0100, 0b0000_0001) == 0b0010_0100 | ROUNDUP(0x24, 0x03) == 0x24 | ROUNDUP(0b0010_0100, 0b0000_0011) == 0b0010_0100 | ROUNDUP(0x24, 0x07) == 0x28 | ROUNDUP(0b0010_0100, 0b0000_0111) == 0b0010_1000 | ROUNDUP(0x24, 0x0F) == 0x30 | ROUNDUP(0b0010_0100, 0b0000_1111) == 0b0011_0000 | ROUNDUP(0x24, 0x1F) == 0x40 | ROUNDUP(0b0010_0100, 0b0001_1111) == 0b0100_0000 | ROUNDUP(0x24, 0x3F) == 0x40 | ROUNDUP(0b0010_0100, 0b0011_1111) == 0b0100_0000 | ROUNDUP(0x24, 0x7F) == 0x80 | ROUNDUP(0b0010_0100, 0b0111_1111) == 0b1000_0000 |
弿°nã§åãä¸ã対象ã¨ãã2鲿°ã®æ¡æ°ãï¼æ¡æ°ãã®ãã®ã§ã¯ãªãï¼ããããã¹ã¯ã§æå®ããã¨ããã®ç¯å²ã«ã¦ããããç«ã£ã¦ãããªããåãä¸ãå¯¾è±¡æ¡æ°+1ã®æ¡ã«0b01ããã£ãªã¼ãªã¼ãã¼ãããã
47
Cããã°ã©ãã³ã°ã®æ¬ã§ã¯å¤§æµããã¯ãã®å®ç¾©ã¨ãã¦æ¬¡ã®ãããªä¾ãæãã¦ãã¾ãã
#define isupper(c) (((c) >= 'A') && ((c) <= 'Z'))
ãããä¸è¨ã®ãã¯ãå®ç¾©ã次ã®ããã«ä½¿ç¨ããå ´åãé大ãªåé¡ãçºçãã¾ããï¼ãã®åé¡ã¨ã¯ä½ã§ããããï¼ï¼
char c; /* ... */ if(isupper(c++)) { /* ... */ }
å®éã«ã¯å¤§åã®ã©ã¤ãã©ãªã§ãï¼types.hã§å®£è¨ããã¦ããï¼isupperããã¯ãã¨ãã¦ï¼ç¹ã«å¯ä½ç¨ãªãï¼å®è£ ãã¦ãã¾ããããªãã®ã·ã¹ãã ã§ã¯ãã©ã®ããã«isupper()ãå®è£ ãã¦ããã調ã¹ã¦ã¿ã¾ãããã
ãã¯ãå±éã«ãã£ã¦ã
if((((c++) >= 'A') && ((c++) <= 'Z')))
ââã¨ãã風ãªã³ã¼ãã«å±éãããããã&&
ã®å³å´ã®å¼ã§è©ä¾¡ããå¤ããæå³ãã¦ããå¤ã¨ã¯å¥ç©ã«ãªã£ã¦ãã¾ãã
ã¡ãªã¿ã«&&
ã¯å¯ä½ç¨å®äºç¹ã§ãããããå¯ä½ç¨ãè¤æ°åçºçããæªå®ç¾©ã®ã³ã¼ãã«ã¯è©²å½ããªãã
Visual Studio 2013ãTDM-GCCï¼GCC 4.8.1ï¼ãglibcãFreeBSDãNetBSDã®ctype.hã軽ãè¦ãéããisupper()ã¯é¢æ°ã¨ãã¦å®ç¾©ããã¦ãããããã¯ãã®å ´åã§ã__isctype()ã®ãããªå¥ã®é¢æ°ã1åå¼ã³åºãï¼ãã®éisupper()ã®å¼æ°ã1ã¶æã ã使ç¨ããï¼ã³ã¼ãã«å±éãããããã«ãªã£ã¦ããã
48
颿°ã®å¼æ°ã¨ãªã夿°ãæå®ããããã«ellipsis (â¦)ã使ããã¦ãããã¨ã¯ããåç¥ã§ãããããï¼printf颿°ã®ãããã¿ã¤ã宣è¨ã¯ã©ããªãã§ããããï¼ï¼ãã¾ããæ¬¡ã®å®£è¨ã®åé¡ç¹ã¯ä½ã§ããããï¼
int VarArguments(...) { /*....*/ return 0; }
åæããI hope you know that ellipsis (...) is used to specify variable number of arguments to a functionããªã®ã§ãã颿°ã«ã¦å¯å¤é·å¼æ°ãå®ç¾©ããã®ã«çç¥è¨å·ï¼...ï¼ãç¨ãããããã¨ã¯ãåç¥ãã¨æãã¾ããã¨ããæãã ã¨æãããã
å®éã«å¯å¤é·å¼æ°ãåãæ±ã颿°ãå®è£ ãã¦ã¿ãã°åããããva_start(3)ã®å¼æ°ã®1ã¤ã¨ãã¦å¯å¤é·å¼æ°ã¨ãªãé¨åã®ç´åã®å¼æ°ã渡ãå¿ è¦ãããããã®ãããå¯å¤é·ã¨ãªãé¨åï¼â颿°ã®å®£è¨ã«ã¦çç¥æ©å·ãè¨è¿°ããé¨åï¼ã®ç´åã«1ã¤ä»¥ä¸ã®å¼æ°ããªãã¦ã¯ãªããªãã
ãã¨ããã¯èè¶³ã ããå¯å¤é·å¼æ°ã¨ãã¦å®éã«ã©ã®åã®å¤ãã©ã®é çªã§ä½å渡ãããããç¥ãæ¨æºçãªæ¹æ³ãç¡ããããä¾ãã°å¼æ°ã®åæ°ã渡ãã¨ããprintf(3)ã®ãã©ã¼ãããæååã®ãããªãã®ï¼ã©ã®åã®å¼æ°ããã©ã®é çªã§å¼æ°æå®ããã¦ãããã夿ããææã¨ãªã代ç©ï¼ã渡ããªã©ã®å·¥å¤«ãå¿ è¦ã¨ãªãããã®ãããçµå±ã¯å¯å¤é·å¼æ°ä»¥å¤ã«1å以ä¸ã®å¼æ°ãå¿ è¦ã¨ãªããã¨ãå¤ãã
ãã£ã¦ãä¾ãã°æ¬¡ã®ãããªå®£è¨ã«å¤æ´ããå¿ è¦ãããã ããã
/* ä¾ï¼ï¼å¯å¤é·å¼æ°ã¨ãã¦å ¨ã¦åãåã®å¤ãã¨ãã * 弿°ã®åæ°ã渡ãããã«ããï¼ä½¿ãåæã¯å¾®å¦ããï¼ */ int VarArguments(const size_t nargs, ...) { /*....*/ return 0; }
/* ä¾ï¼ï¼å¯å¤é·å¼æ°ã¨ãã¦å ¨ã¦åãåï¼ããã§ã¯const char *ï¼ã®å¤ãã¨ãã * 常㫠1å以ä¸ã®å¼æ°ãè¦æ±ããã * 弿°ã®çµããã¯çªå µã§å¤å®ããï¼execl(2)ã§æå¾ã«NULLãè¦æ±ããã®ã¨åãï¼ */ int VarArguments(const char *first, ...) { /*....*/ return 0; }
/* ä¾ï¼ï¼å¯å¤é·å¼æ°ã¨ãã¦è²ã ãªåã®å¤ãã¨ãã®ã§ã * ã©ã®åãã©ã®é çªã§æ¸¡ãããåãããããªããè¨èªçãªå¼æ°ã渡ãããã«ããã * ï¼printf(3)ãscanf(3) ã®ãã©ã¼ãããæååã®ãããªãã®ï¼ */ int VarArguments(const char *fmt, ...) { /*....*/ return 0; }
49
3ã¤ã®æ´æ°ã®ãã¡æå°ã®ãã®ãè¦ã¤ããCããã°ã©ã ããæ¯è¼æ¼ç®åãä¸å使ããã«æ¸ãã¦ãã ããã
ããã¦ããã®åé¡ã®ä½è ãæ±ãã¦ãããã®ã¨ã¯ç°ãªãã ããè§£çãæ¸ãã
#include <math.h> #include <stdio.h> #define NELEMS(ary) (sizeof(ary) / sizeof((ary)[0])) static int smallest(const int a, const int b, const int c) { return (int) fmin(fmin((double) a, (double) b), (double) c); } int main(void) { static const int TESTDATA[][4] = { { -1, 0, 1, -1}, { 0, -1, 1, -1}, { 1, 0, -1, -1}, { 1, 2, 3, 1}, { -1, -2, -3, -3}, }; size_t i; for (i = 0; i < NELEMS(TESTDATA); i++) { int retval = smallest(TESTDATA[i][0], TESTDATA[i][1], TESTDATA[i][2]); printf("smallest(%d, %d, %d) == %d : %s\n", TESTDATA[i][0], TESTDATA[i][1], TESTDATA[i][2], retval, retval == TESTDATA[i][3] ? "OK" : "NG"); } return 0; }
C99以éå°ç¨ãã¤math.hã使ç¨ãC++ãªãstd::minã使ãã ãããªãããã®åé¡ã«éã£ã¦ããã°ããã®ãããã¤ã³ãããªæ¹æ³ã§ããã
50
printf颿°ã®æ¸å¼æå®å%nã¯ã©ãåãã§ããããï¼
printfã®å¼æ°ã«æå®ãããã¤ã³ã¿ãæã示ãå ã®å¤æ°ã«ã%nãåºç¾ããã¾ã§ã«åºåããæåæ°ãæ¸ãè¾¼ã¾ããã
51
52
ã©ã®ããã«ããã°printf颿°ã使ã£ã¦ãI can print %ã¨åºåã§ããã§ããããï¼ï¼%ã¯æ¸å¼æå®åã¨ãã¦ä½¿ç¨ããããã¨ãå¿ããªãã§ãã ããï¼ï¼
è§£çãã®ï¼ï¼%ãã¨ã¹ã±ã¼ãããã
printf("I can print %%\n");
è§£çãã®ï¼ï¼%sã®å¼æ°ã«ãã¦ãã¾ãã
printf("%s\n", "I can print %");
å¤é¨ããåå¾ãããã¼ã¿ãåºåãããããªã±ã¼ã¹ã§ã¯ãã»ãã¥ã¢ã»ã³ã¼ãã£ã³ã°çã«ã¯è§£çãã®ï¼ã®ææ³ãå¯ä¸ã®é¸æè¢ã¨ãªãã¯ãã
53
次ã®2ã¤ã®Cè¨èªã®å®£è¨ã«ã¯ãã©ã®ãããªéããããã§ããããï¼
const char *p; char* const p;
const char *p
ã¯ããcharåã®ãconstãªï¼å¤æ´ä¸å¯è½ãªï¼èªã¿è¾¼ã¿å°ç¨ãªï¼ãªãã¸ã§ã¯ãããæã示ããã¤ã³ã¿åã®ã夿´å¯è½ãªå¤æ°pããæå³ãããpèªä½ã®å¤ã夿´ãããã¨ã¯å¯è½ã ããpãæã示ãå
ã®ãªãã¸ã§ã¯ãã®å¤ã夿´ãããã¨ã¯è¨±ããã¦ããªãã
const char *p; /* p ã®å¤ã¯å¤æ´ãã¦ããã */ p = "hello, world"; p++; p--; /* ã§ã p ãæã示ãå ã®é åã夿´ãããNG */ #if 0 *p = 'H'; #endif
char* const p;
ã¯ããcharåã®ã夿´å¯è½ãªãªãã¸ã§ã¯ãããæã示ããã¤ã³ã¿åã®ãconstãªï¼å¤æ´ä¸å¯è½ãªï¼èªã¿è¾¼ã¿å°ç¨ãªï¼å¤æ°pããæå³ãããpèªä½ã®å¤ã夿´ãããã¨ã¯è¨±ããã¦ããªãããpãæã示ãå
ã®ãªãã¸ã§ã¯ãã®å¤ã夿´ãããã¨ã¯å¯è½ã§ããã
char msg[] = "hello, world"; char* const p = msg; /* p ã®å¤ã¯å¤æ´ã§ããªã */ #if 0 p++; p--; #endif /* p ãæã示ãå ã®é åã¯å¤æ´ãã¦ããã */ *p = 'H';
54
memcpy 㨠memmoveã®éãã¯ä½ã§ããããï¼
ã³ãã¼å ã¨ã³ãã¼å ã®ã¡ã¢ãªé åã«éãªãåã£ã¦ããé¨åãããéã®æåãç°ãªããmemcpyã§ã¯æªå®ç¾©ã®åä½ã¨ãªãããmemmoveã®å ´åã¯æ£ããåä½ããã
ãã¨ãä¸è¬çã«ã¯memcpyã¯memmoveãããé«éã§ãããã¨ãå¤ãã
55
doubleåã¨floatåã®å¤ãåºåããprintfç¨ã®æ¸å¼æå®åã¯ä½ã§ããããï¼
C95以åãªãfãFãeãEãgãGã®6種é¡ãC99以éã§ã¯aãAãå ãã8種é¡ãå³å¯ã«ã¯ãããã¯doubleåç¨ã®æ¸å¼æå®åã ããå¯å¤é·å¼æ°ã§ã¯floatåã®å¤ãdoubleåã«ææ ¼å¤æãããããããããã®æ¸å¼æå®åã使ç¨ãã¦åé¡ãªãï¼ããããfloatåå°ç¨ã®æ¸å¼æå®åã¯åå¨ããªãï¼ã
ã¡ãªã¿ã«scanfç³»ã®é¢æ°ã®å ´åã¯ãfloatåã®å ´åã¯aãfãeãgã®4種é¡ãdoubleåã®å ´åã¯laãlfãleãlgã®4種é¡ã¨ãªãããã¡ãã¯å¼æ°ããã¤ã³ã¿åï¼float *ãdouble *ï¼ãªã®ã§ææ ¼å¤æã¯ãããªãã¨ãããããã¤ã³ã¿çµç±ã§æ¸ãè¾¼ãå ã®å¤§ãããç°ãªãã®ã§ãæ¸å¼æå®åãåããå¿ è¦ãããã
56
ãã·ã³ã®ã¿ã¤ãããªãã«ã¨ã³ãã£ã¢ã³ãããã°ã¨ã³ãã£ã¢ã³ããå¤å¥ãããå°ããªCããã°ã©ã ãæ¸ãã¦ãã ããã
https://github.com/eel3/boc/blob/master/boc.cãåç §ã®ãã¨ã
57
ã»ãã³ãã³ã使ããã«Hello World!ã¨åºåããCããã°ã©ã ãæ¸ãã¦ãã ããï¼
â¦â¦ã¨ãããã¨ã¯ãreturnãæ¸ããªãã¦OKã¨ãããã¨ããC99以éãC++ãªãæ¸ ã ããã¾ã§ã«åæ³çã ãããªããC95以åã ã¨ã°ã¬ã¼ã¾ã¼ã³ã ã¨æããã©ã
ã¨ããããããããªæãã§ã
#include <stdio.h> int main(void) { if (puts("Hello World!")) {} }
*1:使ç¨ããã³ã³ãã¤ã©ãè¦åãªãã·ã§ã³æ¬¡ç¬¬ã ããfoo()ã®å¼æ°pãmain()ã®å¼æ°argcãæªä½¿ç¨ã§ãããã¨ã®è¦åã¨ãfoo()ãå¤é¨å ¬éããã颿°ãªã®ã«ãããã¿ã¤ã宣è¨ãè¦å½ãããªãã¨ããè¦åããgccã§ã¯çºããããå¯è½æ§ãããã
*2:æã¯1ã®è£æ°ãæ¡ç¨ããã³ã³ãã¥ã¼ã¿ãå¤ãã£ããããã