void main() {
int c;
while ((c = getchar()) != EOF) {
putchar(c);
}
}
由于不等运算符的优先级高于复制运算符,c = getchar() != EOF等价于c = (getchar() != EOF)所以前者的c获取的是字符值,后者的c的值只会是0或者1。
在没有任何输入的情况下默认返回一个特殊值EOF ,c的大小除了存储所有字符外,还必须大到可以存储文件结束符EOF
EOF默认值为-1
printf("EOF is %d\n", EOF);
void main() {
int c;
while ((c = getchar()) == 'q') {
putchar(c);
}
}
int a ;//定义一个全局变量a,是要标记存储空间的
extern int a ;//声明一个全局变量a
int a = 3;//定义一个全局变量并初始化为3,标记存储空间
extern int a = 3;//定义一个全局变量并初始化为3
int global = 9;
static int i = 5;
void test()
{
int m = 3;
i = 10;
}
静态存储区相对固定,用于存放全局变量和静态变量,内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量, static 变量
局部作用域,局部变量m存放在栈中,当test函数结束,m将被销毁。
global为全局变量,作用域为当前文件,生存周期为整个程序执行周期,在进程销毁时销毁。
i为静态全局变量,作用域为当前文件,i在进程销毁时销毁。以test接口举例,虽然已经给i重新赋值,但是下次调用该接口时i的值还是5。
算术运算式中,低类型能够转换为高类型。
赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。
函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。
{char, uchar, short, ushort}->int-> uint->long->ulong->float->double
负号运算符-、按位取反运算符~、自增/减运算符++/–、取值运算符*(对指针变量操作)、取地址运算符(&变量/函 数名)、逻辑非运算符(!表达式)、类型强转、sizeof(长度运算符),结合性从右至左
表达式1 ? 表达式2 : 表达式3
if(n & 1 == 1){ //(n&1 == 0)则n是偶数
return 1;
}
void swap(int x, int y) {
#if 0
int temp = x;
x = y;
y = temp;
#endif
x ^= y;
y ^= x;
x ^= y;
}
一个数字和0异或是它本身,和它本身异或是0
int find(int[] arr, int len){
int tmp = arr[0];
for(int i = 1;i < len; i++){
tmp ^= arr[i];
}
return tmp;
}
long long res = 1;
while(n) {
res * = m;
n &= (n - 1);
}
bool bTestFlag = FALSE;
if(bTestFlag);
if(!bTestFlag);
int * p = NULL;
if(NULL == p);
if(NULL != p);
const float EPSINON = 0.00001;
float fTestVal = 0.0;
if((fTestVal >= -EPSINON) && (fTestVal <= EPSINON));
按字母或数字顺序排列各条 case 语句、把正常情况放在前面,而把异常情况放在后面、按执行频率排列 case 语句、default 子句只用于检查真正的默认情况
int value[10] = {11, 333};
int *ptr = &value[0];
*ptr += 1;
等同于
(*ptr)++;//()是为了先取值后加1
等同于
++*ptr;
/*因为一元运算符 ++ 和 * 的结合律是从右至左*、