main(){ ... }
函数是一个特殊的函数,并不需要参数。
格式符:
%d
按照十进制整型数打印%ld
长整型%6d
按照十进制整型数打印,至少6个字符宽%f
浮点数打印%.2f
浮点数,小数点后有两位%3.2f
浮点数,小数点后有两位,占3个字符宽%o
8进制%x
16进制%%
表示%号本身
符号常量:
符号常量大写,语句结尾无需分号。
#define NUMBER 10
限定符const
const cant_modified = 'always';
其值将不能被修改。
字符输入输出getchar putchar
EOF(end of file),定义在stdio.h
中,是个constant,一个整型数。
在没有输入时,getchar将返回一个特殊值,被称为EOF。
#include <stdio.h>
main(){
int c;
c = getchar();
while (c != EOF){
putchar(c);
c = getchar();
}
}
/* simplify edition */
main(){
int c;
while ((c = getchar()) != EOF){
putchar(c);
}
}
类型转换
赋值时也需要进行类型转换,赋值运算符右边的值需要转换为左边变量的类型,左边变量的类型即赋值表达式结果的类型。
把较长的整数转换为较短的整数或char类型时,超出的高位部分将被丢弃。
int i;
char c;
i = c;
c = i;
执行后,c的值将保持不变。但是如果反过来,把高位的转换为低位,则有可能丢弃超出的高位部分。
所以当 float f;
转换为 int i;
,即 i = f;
,小数部分将被舍弃,是进行四舍五入还是舍弃取决于具体的实现。
强制类型转换
在任何表达式中都可使用强制类型转换:(类型名) 表达式
Note:强制类型转换只是生成一个指定的n的值,n本身的值并没有变。强制类型运算符和其他一元运算符优先级相同。
#include <math.h>
sqrt((double) n)
/* 2将被自动转换为2.0 */
duble sqrt2(double);
root = sqrt2(2);
单双引号
C中单双引号是有区别的,单引号中表示字符,而双引号表示字符串。
因此 'a'
表示字符, 在ASCII码中对应数字为97 。
printf("%d\n", 'a'); /* 将会打印97 */
自增自减,前缀后缀的区别
如果单单是用在变量上,两者最后结果是一样的:如 n++
和++n
结果是一样的。 但是前缀和后缀在C中还是有区别的:
++n
表示先将n的值递增1;
n++
表示先使用变量n的值,再将n值递增1。
所以,如果n的值为10:
x = n++;
x的值还是10,n为11
x = ++n;
x的值为11,n为11
表达式(a+b)++
是非法的。
#include <stdio.h>
main(){
char a[] = "wha";
int n = 2;
a[n++] = 't';
a[n++] = '\0'
printf("%s\n", a);
}
结果为: wht
('\0'
为字符串结束符号)
n=2, a[n++] = 't'
后缀自增此时最先作用的其实是a[n] = 't'
, 之后n才会做自增。
函数
placeholder() {}
像这样什么不执行任何操作,不返回任何值的空函数一般用来做预留。
如果函数定义中省略了返回值类型,则默认认为 int 类型。
三元操作符
int a, b, samll;
a = 10;
b = 20;
small = (a < b) ? a: b;
/* like python: small = b if a > b else a */