C语言速成手册(二):布尔值、条件判断、循环

逻辑运算符
    作用   |  C  | Pascal
  ———+—–+———–
    等于   | ==  |  =
   不等于  | !=  |  <>
    小于   | <   |  <
    大于   | >   |  >
  小于等于 | <=  |  <=
  大于等于 | >=  |  >=
     且    | &&  |  and
     或    | ||  |  or
     非    |  !  |  not

C语言的if语句
    C语言中if语句的写法如下:
if (表达式)
{
    表达式为真时执行的内容
}

    之前说过,如果执行的内容只有一句话,花括号可以省略。

    下面的语句将返回整数a的绝对值:
if ( a<0 )
   a= -a;

    下面的语句用于实现排序网络中的比较算子:
if ( a>b )
{
   int c=a;
   a=b;
   b=c;
}

     C语言中也有else if和else的用法,但和Pascal不同的是else的前一条语句末要保留分号。下面的语句用于判断三边长分别为a, b, c的三角形是什么三角形:
if ( a+b>c && b+c>a && a+c>b )
{
  if ( a==b && b==c )
    printf("Regular Triangle");
  else if ( a==b || b==c || a==c )
    printf("Isosceles Triangle");
  else
    printf("Scalene Triangle");
}
else
  printf("Triangle Doesn't Exist.");

C语言的bool类型
    C语言中没有布尔类型。任何一个整型的变量都可以充当布尔变量,用0表示False,其它数(默认为1)表示True。
    观察下列代码片断。
printf("%d n", 3+5 == 8);

int a;
a = 3+5==9;
printf("%d n" , a);
a = 100 <= 100;
printf("%d n" , a);

a = 1;
if(a) printf("a is 1n");
a = 2;
if(a) printf("a is 2n");
a = -1;
if(a) printf("a is -1n");
a = 0;
if(a) printf("a is 0n");
if(!a) printf("a is not 0n");

    这段程序的输出为:
1
0
1
a is 1
a is 2
a is -1
a is not 0

    如果觉得别扭,你可以使用_Bool类型。你可以把_Bool看作整型,但它只能储存0和1两个值。
    下面三句话将输出数字1,这是因为_Bool类型把所有非0数都当做是1。
_Bool a;
a = 100;
printf("%d", a);

    如果你想像Pascal一样使用true和false,那么你可以包含头文件stdbool.h。这样你可以定义变量为bool类型并赋值为true或false。例如:
bool a = true;
if (a) printf("a is true");

    下面是两个完整的程序。第一个程序中_Bool可以替换成int。三种写法都正确,你可以选择一种自己喜欢的写法。
#include <stdio.h>
_Bool isNegative ( int a )
{
   if (a<0) return 1;
   else return 0;
}
int main()
{
   if ( isNegative(-100) )
     printf("-100 is Negative");
   return 0;
}

#include <stdio.h>
#include <stdbool.h>
bool isNegative ( int a )
{
   if (a<0) return true;
   else return false;
}
int main()
{
   if ( isNegative(-100) )
     printf("-100 is Negative");
   return 0;
}

C语言的for循环
    for循环使用下面的语句:
for ( 语句1; 语句2; 语句3 )
{
    循环内容
}

    其中语句1用于初始化,若语句2为真(非0)则进入循环;每次循环后将执行语句3,此时若仍然满足语句2则继续循环,否则退出。语句123中,某一种语句可能为空,也可能由多条语句组成(多条语句用逗号隔开)。
    下面的语句打印1到10这10个数。以下所有写法都是正确的。通常用第一种写法。
int i;
for (i=1; i<=10; i=i+1)
   printf("%dn", i );

int i=1;
for ( ; i<=10; i=i+1)
   printf("%dn", i );

int i;
for (i=1; i<=10; )
{
   printf("%dn", i );
   i=i+1;
}

int i;
for (i=1; i<=10; printf("%dn", i ), i=i+1 );

    巧妙地应用for循环可以使某些操作非常简单。下面的函数可以计算n的质因子个数:
long countPrimeFactor( long n )
{
  long d, count;
  for (d=2, count=0; n>1; d=d+1 )
     for ( ; n%d==0; count=count+1, n=n/d );
  return count;
}

    下面的语句将产生死循环:
for ( ; ; ) ;

C语言的while循环
    while循环格式如下:
while ( 循环条件 )
{
   循环内容
}

    下面的代码计算1394和6150的最大公约数:
int a=1394, b=6150;
while ( b )
{
   int tmp = a % b;
   a = b;
   b = tmp;
}
printf("The gcd is %d", a);

do..while循环
    do..while循环的格式如下:
do
{
    循环内容
}
while ( 循环条件 );

    将条件放在循环内容的后面,使程序至少执行循环内容一次。

循环控制
    C语言中使用break语句和continue语句来控制循环,其使用方法与Pascal完全一样。

switch语句
    switch语句相当于Pascal中的case语句。
    下面代码的输出为2 3 default done! , 因为switch语句只负责把程序运行的位置跳转到相应的地方。
int n=2;
switch (n)
{
    case 1: printf("1 ");
    case 2: printf("2 ");
    case 3: printf("3 ");
    default: printf("default ");
}
printf("done!");

    你可以用break语句实现Pascal的case,例如下面的写法就可以让程序输出2 done! :
int n=2;
switch (n)
{
    case 1:
       printf("1 ");
       break;
    case 2:
       printf("2 &
#34;);
       break;
    case 3:
       printf("3 ");
       break;
    default: printf("default ");
}
printf("done!");

goto语句
    你可以在程序的任何位置插入一个标签:
标签名:
    并在同一函数里使用下面的语句实现无条件跳转:
goto 标签名;
    例如,下面的代码将产生死循环,并输出满屏幕的求爱信息。
a: printf(" I Love You !!!!!!! ");
goto a;

Matrix67原创
转贴请注明出处

13 条评论

  • asukanokaze

    为什么学c而不是c++

    oi风格应该是c style和cpp style的混用

    比如
    #include<iostream>
    using namespace std;
    int main()
    {
         int n,f[1000000],ans=0;
         scanf("%d",&n);
         for(i=0;i<n;i++)scanf("%d",&f[i]);
         work(); //to be filled;
         cout<<ans<<endl;
         return 0;
    }

    回复:还是那句话,先学C再学C++是王道。
    我最后会写一篇C++的简单介绍,说一说对象和类,using namespace std的意思等等,告诉大家C++真的很容易。

  • windywinter

    小心TLE。

  • edwin89102

      我没有学过C,但是学过java,大牛发的代码我都能看懂了
    C++就没学过,估计应该不太难.当初打算学C时候,但是却学了Pascal(原因忘)

    回复:java有前途

  • Richardyi

    To 2nd floor:
    LOVE HAS NO TIME LIMIT.

  • blur

    现在的年轻人都太强了…
    C++很容易?…高级语言没难的啦,对你来说~
    学JAVA的话推荐robocode~很适合你们这帮天才~
    废话完了,闪

    回复:现在的年轻人确实很强,不过您也不老啊

  • 忍的阵雨

    for循环里第二个语句判断语句,若写多个句子,用逗号隔开,则只判断最后一个句子的真假。

  • km

    计算n的质因子个数的代码不对啊

  • cervelo

    一大串看不懂的,就没有人指导下。

  • pekmano

    那个计算n质因子的代码不对…

回复给 pekmano 取消回复