• Index

[C语言] 07-基本语句和运算

Reads: 1102 Edit

一、基本语句

C语言的基本语句跟Java中的差不多,所以,这里只是简单地提一下

  • 循环语句(do while、while、for)

  • 条件语句(if 、if-else、switch)

  • goto语句

二、基本运算

计算机的基本能力就是计算,所以一门语言的计算能力十分重要。C语言之所以无所不能,很大原因在于它有强大的计算能力。C语言一共有34种运算符,其中的大多数运算符跟在Java中的用法是一样的。下面做一个简单介绍。

1.算术运算符

+ 加法运算符

-  减法运算符,或负值运算符

*  乘法运算符

/  除法运算符

%  模运算符,或称取余运算符,要求%两侧均为整型

##2.关系运算符

<   小于运算符

<=  小于等于运算符

>   大于运算符

>=  大于等于运算符

==  等于运算符

!=  不等于运算符
  • 关系运算的结果成立就为"真"(比如5>=4),不成立则为"假"(比如5<4)

  • 在Java中,关系运算的结果为"真"就返回true,"假"则返回false,用boolean类型的变量来接收

boolean b1 = 5 > 4; // true

boolean b2 = 5 < 4; // false

C语言中没有boolean类型

  • 在C语言中,关系运算的结果为"真"就返回1,"假"就返回0
int a1 = 5 > 4; // 1

int a2 = 5 < 4; // 0
  • 还需注意的是,在C语言中,任何非0值都为"真",只有0值才为"假"

所以下面的做法是对的:

int a = 10;

if (a) {
    printf("条件成立");
} else {
    printf("条件不成立");
}

因为a不为0,所以为"真",输出结果是: 10

若是在Java中,编译器直接报错了,因为if的括号()中只能放boolean类型的值。

以此类推,下面的写法也是对的:

int a = 10;

if (a = 0) {
    printf("条件成立");
} else {
    printf("条件不成立");
}

上述代码是完全合理的,编译器不会报错,只是个警告而已。因为a为0,所以为"假",输出结果是: 1

这样看来,C语言似乎比Java方便很多,其实有很大的陷阱在这里:

假设你本来是想判断a是否为0,那么本应该写if (a == 0),若你误写成了if (a = 0),那将是一件非常可怕的事情,因为编译器又不报错,这样的BUG就难找了。因此,像a==0这样的表达式,最好写成0==a,若你误写成0=a,编译器会直接报错的。

// 不推荐
if (a == 0) {
}

// 推荐
if (0 == a) {
}
  • 在C语言中,可以不保存关系运算的结果

因此,下面的写法是合法的:

int a = 10;
a > 10;
a == 0;

如果是在Java中,第2、3行编译器会直接报错,但在C编译器看来是合法的,只是个警告。

所以,这里又是一个陷阱,假设你的本意是想给a赋值为0,那么本应该写a = 0; ,若你误写成a == 0; ,那将又是一个非常难找的BUG,因为编译器根本不会报错。在1993年的时候,这个BUG差点让一桩价值2000万美元的硬件产品生意告吹,因为如果这个BUG不解决,这个产品就没办法正常使用。

##3.逻辑运算符

&&  逻辑与运算符

||  逻辑或运算符

!   逻辑非运算符

逻辑运算的结果也只有两个:成立就为"真",返回1;不成立就为"假",返回0

##4.赋值运算符

1.简单的赋值运算符 = :int a = 5;

2.复合赋值运算符

 +=  加赋值运算符。如a += 3+1,等价于 a = a +(3+1)

-=  减赋值运算符。如a -= 3+1,等价于 a = a -(3+1)

*=  乘赋值运算符。如a *= 3+1,等价于 a = a *(3+1)

/=  除赋值运算符。如a /= 3+1,等价于 a = a /(3+1)

%=  取余赋值运算符。如a %= 3+1,等价于 a = a %(3+1)

##5.自增运算符和自减运算符

++  自增运算符。如a++,++a,都等价于a = a+1

--  自减运算符。如a--,--a,都等价于a = a-1

##6.逗号运算符和逗号表达式h

  • 逗号运算符主要用于连接表达式,例如:
int a = 9;
int b = 10;
 
a = a+1 , b = 3*4;
  • 用逗号运算符连接起来的表达式称为逗号表达式,它的一般形式为:
表达式1, 表达式2, … …, 表达式n

逗号表达式的运算过程是:从左到右的顺序,先计算表达式1,接着计算表达式2,...,最后计算表达式n

  • 整个逗号表达式的值是最后一个表达式的值
int a = 2;
int b = 0;
int c;

c = (++a, a *= 2, b = a * 5); 

printf("c = %d", c);

++a的结果为3,a *= 2的结果为6,b = a * 5的结果为30。因此,输出结果为: 2

这里要注意的是,右边的表达式是有用括号()包住的,如果不用括号包住,也就是:

c = ++a, a *= 2, b = a * 5;
printf("c = %d", c);

输出结果将为: 3a ,因为c = ++a也属于逗号表达式的一部分,跟后面的a *= 2以及b = a * 5是相互独立的

##7.条件运算符和条件表达式

其实就是三目运算符,一般形式为:表达式1 ? 表达式2 : 表达式3

int a = (b > 5) ? 10 : 9;

##8.sizeof

  • sizeof可以用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。
int size = sizeof(10);
printf("10所占的字节数:%d", size);

输出结果: 4 ,10是int类型的数据,在64bit编译器环境下,int类型需要占用4个字节

sizeof一共有3种形式

  • sizeof( 变量\常量 )
sizeof(10);

char c = 'a';
sizeof(c);
  • sizeof 变量\常量
sizeof 10;

char c = 'a';
sizeof c;
  • sizeof( 数据类型 )
sizeof(float);

注意,不可以写成sizeof float;

关于作者

王硕,网名信平,十多年软件开发经验,业余架构师,精通Java/Python/Go等,喜欢研究技术,著有《PyQt 5 快速开发与实战》《Python 3.* 全栈开发》,多个业余开源项目托管在GitHub上,欢迎微博交流。


Comments

Make a comment

www.ultrapower.com ,王硕的博客,专注于研究互联网产品和技术,提供中文精品教程。 本网站与其它任何公司及/或商标无任何形式关联或合作。
  • Index
aaaaa