リリース・改善中
C ガイド · 2/6
この章は現在、英語でのみ提供しています。
C has a small, compact syntax, and most of it fits on a page. This chapter covers the entry point main, variables and operators, functions and prototypes, control flow, and basic console I/O with printf and scanf.
Every C program begins in main. The standard guarantees two signatures:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("argument count: %d\n", argc);
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}If you do not need command-line arguments, write int main(void). argc is the number of arguments and argv holds them as strings; argv[0] is usually the program name. Falling off the end of main is treated as return 0, but being explicit reads better.
Variables are declared with a type before use. Since C99 you can declare them anywhere in a block, including inside a for header. Local variables start with an indeterminate value, so initialize them where you declare them.
int count = 0;
double ratio = 0.75;
const int max_users = 100; /* read-only */
int a = 7, b = 2;
int q = a / b; /* 3: integer division truncates toward zero */
int r = a % b; /* 1: remainder */
double d = (double)a / b; /* 3.5: convert one operand to get real division */
count += 5; /* same as count = count + 5 */
count++; /* increment by one */The operators you will use most:
+, -, *, /, %==, !=, <, <=, >, >=, which yield an int that is 1 or 0&&, ||, !, which short-circuit, so the right side is skipped when the left side decides the result&, |, ^, ~, <<, >>=, +=, -=, *=, /=, and friendsIn C, zero is false and any non-zero value is true. Include <stdbool.h> to get bool, true, and false (C23 makes them proper keywords). A classic slip is writing if (x = 0), which assigns instead of comparing; -Wall warns about it.
A function has a return type, a name, and a parameter list. The compiler reads a file top to bottom, so calling a function before its definition requires a prototype (a declaration) earlier in the file.
#include <stdio.h>
/* prototypes: tell the compiler these functions exist */
int max_of(int a, int b);
void greet(const char *name);
int main(void) {
greet("C");
printf("%d\n", max_of(3, 9));
return 0;
}
int max_of(int a, int b) {
return a > b ? a : b;
}
void greet(const char *name) {
printf("Hello, %s!\n", name);
}Arguments are always passed by value: the function gets a copy, and changing a parameter does not affect the caller. To let a function modify the caller's variable, you pass a pointer, which chapter 6 covers in depth. For a function that takes no arguments, write int f(void); that is what states "no parameters" precisely.
C offers if/else, switch, while, do-while, and for, plus break to leave a loop and continue to jump to the next iteration.
for (int i = 1; i <= 15; i++) {
if (i % 15 == 0) {
printf("FizzBuzz\n");
} else if (i % 3 == 0) {
printf("Fizz\n");
} else if (i % 5 == 0) {
printf("Buzz\n");
} else {
printf("%d\n", i);
}
}
int day = 6;
switch (day) {
case 6:
case 7:
printf("weekend\n");
break; /* without break, execution falls into the next case */
default:
printf("weekday\n");
break;
}
int n = 0;
do {
n++;
} while (n < 3); /* the body always runs at least once */switch works only on integer values. Forgetting break makes execution fall through to the following case, so end every case with break unless fall-through is deliberate.
printf substitutes its arguments into the conversion specifiers of a format string. A specifier that does not match the argument type is undefined behavior, so match them carefully.
| Specifier | Type | Example |
|---|---|---|
%d | int | printf("%d", 42) |
%ld | long | printf("%ld", 42L) |
%u | unsigned int | printf("%u", 7u) |
%zu | size_t | printf("%zu", sizeof(int)) |
%f | double | printf("%.2f", 3.14159) |
%c | character | printf("%c", 'A') |
%s | string | printf("%s", "text") |
%p | pointer | printf("%p", (void *)&x) |
scanf stores what it reads, so it needs the address of each variable (&). It returns the number of items successfully converted, and you should always check it. Note that scanf reads a double with %lf, unlike printf.
#include <stdio.h>
int main(void) {
int age;
double height;
printf("Enter age and height: ");
if (scanf("%d %lf", &age, &height) != 2) {
fprintf(stderr, "invalid input\n");
return 1;
}
printf("age %d, height %.1f\n", age, height);
return 0;
}For reading a line of text, prefer fgets(buf, sizeof buf, stdin), which respects the buffer size. A bare %s has no length limit and can overflow the buffer.
int main(void) or int main(int argc, char *argv[]).switch cases with break.printf specifiers to argument types exactly and always check what scanf returns.
コメント 0件
ログイン · ログインするとコメントできます。
最初のコメントを書いてみましょう。