1、不使用if/:?/switch及其他判断语句如何找出两个int型变量中的最大值和最小值?
int max=((a+b)+abs(a-b))/2;
int min=((a+b)-abs(a-b))/2;
2、比较运算符(> >= < <=)运算顺序是从左往右,赋值运算符运算顺序从右向左
3、如何使用一条语句实现x是否为2的若干次幂的判断?
如果一个数为2的若干次幂,则其二进制的最高位肯定为1,其他位为0,该数减去1后其二进制全为1,将两数进行与操作,判断结果是否为0,可以实现判断x是否是2的若干次幂
(i&(i-1))?true:false
4、逗号表达式
逗号表达式的运算过程为从左往右逐个计算表达式;逗号表达式作为一个整体,它的值为最后一个表达式的值;逗号运算符的优先级在所有运算符中最低。
5、\n与\n\r
换行(\n)就是光标下移一行却不会移到行的开头,回车(\r)就是回到当前行的开头却不向下移一行
按Enter键就是\n\r,一般意义上的回车
Tab是制表符\t,作用是预留8个字符的显示宽度,用于对齐
6、短路求值
所谓的短路求值就是对于(条件1&&条件2),若条件1是false则条件2的表达式会被忽略。对于(条件1||条件2),若条件1为true,则条件2的表达式则被忽略了。
7、printf(“%p\n”,(void*)x)与printf(“%p\n”,&x)有什么区别?
printf(“%p\n”,(void*)x):语句打印x被转换为指针的地址,就是它的值。
printf(“%p\n”,&x)将打印变量x的地址。
8、printf()函数是否有返回值?
有,printf()函数返回一个int值,表示被打印的字符数
#include<iostream>
using namespace std;
int main()
{
int i=1234;
printf("%d\n",printf("&d\n",printf("%d\n",i)));
return 0;
}
//程序输出结果
//1234
//5
//2
注意:’\n’也占据一个字符
9、不能使用任何变量,实现计算字符串长度函数Strlen()
int Strlen(const char* s)
{
if(*s!='\0')
return 1+Strlen(++s);
else
return 0;
}
10、负数除法与正整数除法的运算原理
除号的正负取舍和一般算数一样,符号相同为正,相异为负;
求余符号的正负取舍与被除数符号相同。
11、main()函数执行完毕后,是否可以再执行一段代码?
可以。比如用_onexit注册一个函数,它会在卖你之后执行int fn(void)。需要注意的是,使用_onexit函数需要添加头文件stdlib.h,否则会编译错误
#include<stdio.h>
#include<stdlib.h>
int fn()
{
printf("next\n");
return 0;
}
int main()
{
_onexit(fn);
printf("this is executed first\n");
return 0;
}
//程序输出结果
//this is executed first
//next