在代码开头#include <stdbool.h>,就可以使用bool、true和false
bool b=2;
bool t=true;
t=2;
printf("%d", t);
输出
1
得到输出的实际上还是整数,而不是true或者false。
逻辑运算的规律如下
如果要表示4<x<6,应该是4<x&&x<6而不是4<x<6(4<x<6的结果是1)
将已经学到的运算符的优先级进行比较
有时候会出现短路的情况
条件运算的格式为:a?b:c;
其中a、b、c分别是条件、条件满足时的值和条件不满足时的值。
条件运算符的优先级高于赋值运算符,低于其他运算符,是自右向左结合的。
int i;
i=3+4,5+6;
printf("%d", i);
输出
7
int i;
i=(3+4,5+6);
printf("%d", i);
输出
11
逗号运算主要用在for循环中。
之前已经可以用if语句在两个数中去较大的,那么如何在三个数中去最大的呢?
可以先让前两个数相比较,再取其中较大的与第三个数相比,这两者中较大者即为三个数中的最大数。流程图如下
代码
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
int max=0;
if(a>b){
if(a>c){
max=a;
}else{
max=c;
}
}else{
if(b>c){
max=b;
}else{
max=c;
}
}
printf("The max is %d\n", max);
或者
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
int max=0;
if(a>b)
if(a>c)
max=a;
else
max=c;
else
if(b>c)
max=b;
else
max=c;
printf("The max is %d\n", max);
如果if的条件满足或者不满足时要执行的语句也是if或者if-else语句,这就是嵌套的if语句。
else语句总是和最近的if匹配,缩进格式不能暗示else的匹配。
在if和else后面总是用{},即使只有一条语句。
如果要计算这样一个分段函数
if(x>o){
f=-1;
}else if(x==0){
f=0;
}else{
f=2*x;
}
这是级联的if-else语句,基本格式如下
if(expl)
st1;
else if(exp2)
st2;
else
st3;
对于上面分段函数的例子,还有一种代码
if(x<0){
printf("%d",-1);
}else if(x==0){
printf("%d",0);
}else{
printf("%d",2*x);
}
之前的代码是单一出口,这里的代码不是,单一出口更好。
代码一
代码二
这两种代码是等价的。
switch-case的基本格式如下
switch(控制表达式){
case 常量:
语句
...
case 常量:
语句
...
default:
语句
...
}
switch(type)
{
case 1:
case 2:
printf("你好\n");
break;
case 3:
printf("晚上好\n");
case 4:
printf("再见\n");
break;
default:
printf("啊,什么啊?\n");
break;
}
如果输入1,那么程序将会在进入case1之后再次进入case2,之后退出switch-case,输入3将会进入case3之后进入case4然后退出switch-case。
写一段程序求以2为底x的log值
程序如下
int x;
int ret=0;
//scanf("%d", &x);
x=128;
while(x>1){
x/=2;
ret++;
}
printf("log2 of %d is %d.", x, ret);
输出
log2 of 1 is 7.
显然x的输出是不正确的。因为printf里的x是已经计算过的x。
这里有一个小套路,就是在x参与计算之前定义一个t,t=x,将x原本的值储存到t中,最后输出t即可。
为什么程序中定义ret=0?为什么while后的条件是x>1?这些值是如何定出来的呢?
这些值是相互影响的,共同影响循环的次数和结果,需要具体问题具体分析。
来看另一个例子。
int count=100;
while(count>=0){
count--;
printf("%d\n",count);
}
printf("发射!\n");
小套路:如果要模拟一个很大次数的循环,可以模拟较少的循环次数,然后做出推断。
int n=3;
while(n>=0){
printf("%d", n);
n--
}
printf("发射\n");
假设n=3
n 3 2 1 0 -1
输出 3 2 1 0
int n=3;
while(n>=0){
n--;
printf("%d", n);
}
printf("发射\n");
n 3 2 1 0 -1
输出 2 1 0 -1
回到之前count=100的例子,三个问题的答案分别是
问题:让用户输入一系列正整数,最后输入-1表示输入结束,计算这些数的平均值,输入这些数的个数和平均值。
变量->算法->流程图->程序
程序如下
int main()
{
int number;
int sum=0;
int count=0;
do{
scanf("%d", &number);
if(number!=-1){
sum+=number;
count++;
}
}while(number!=-1);
/*scanf("%d", &number);
while(number!=0){
sum+=number;
count++
scanf("%d", &number);
}
第一种算法每一轮要对number是否等于-1要做两次判断,比较浪费*/
printf("%f\n", 1.0*sum/count);
}
计算机想一个数,用户输入一个数,如果不一样输出大了还是小了,直至猜中,输出猜了多少次。
算法:
循环的条件是a和number不相等
srand(time(0));//召唤一个随机的整数
int number = rand()%100+1;
int count = 0;
int a = 0;
printf("我已经想好了一个1到100之间的数。");
do{
printf("请猜这个1到100之间数:");
scanf("%d", &a);
count++;
if(a>number){
printf("你猜的数大了");
}else if(a<number){
printf("你猜的数小了");
}
}while(a!=number);
printf("太好了,你用了%d次就猜到了答案。\n", count);
100以内的数最多猜7次(二分法)
输入一个正整数,输出逆序的数(注意0的处理)。
代码如下
int x;
scanf("%d", &x);
int digit;
/*int ret=0;
while(x>0){
digit=x%10;
ret=ret*10+digit;
x/=10;
}
printf("%d", ret);
这种算法可以把逆序排在首位的0省去*/
while(x>0){
digit=x%10;
prntf("%d", digit);
x/=10
}
return 0;
if语句的常见错误
if(x<0){
f=-1;
}else if(x==0){
f=0;
}else{
f=2*x;
}
if(x<0)
{
f=-1;
}else if(x==0)
{
f=0;
}else
{
f=2*x;
}
if(x<0)
{
f=-1;
}
else if(x==0)
{
f=0;
}
else
{
f=2*x;
}