首页 > 其他分享 >学习C语言的第4天--运算符与流程控制

学习C语言的第4天--运算符与流程控制

时间:2024-08-02 15:54:50浏览次数:16  
标签:语句 示例 -- C语言 运算符 int 循环 printf

今日目标

  1. 了解各种运算符及其用法。
  2. 掌握条件语句和循环语句的使用。
  3. 每日练习

目录

运算符

运算符用于执行各种操作,包括算术运算、逻辑运算、关系运算等。以下是C语言中的主要运算符。

1. 算术运算符

算术运算符用于执行基本的数学运算。

运算符描述示例
+加法a + b
-减法a - b
*乘法a * b
/除法a / b
%取模(余数)a % b

示例

int a = 10, b = 5;
int sum = a + b;    // 15
int diff = a - b;   // 5
int prod = a * b;   // 50
int quot = a / b;   // 2
int mod = a % b;    // 0

2. 关系运算符

关系运算符用于比较两个值。

运算符描述示例
==等于a == b
!=不等于a != b
>大于a > b
<小于a < b
>=大于等于a >= b
<=小于等于a <= b

示例:

int x = 10, y = 20;
int isEqual = (x == y);    // 0 (false)
int isNotEqual = (x != y); // 1 (true)
int isGreater = (x > y);   // 0 (false)
int isLess = (x < y);      // 1 (true)
int isGreaterOrEqual = (x >= y); // 0 (false)
int isLessOrEqual = (x <= y);    // 1 (true)

3. 逻辑运算符

逻辑运算符用于执行逻辑操作。

运算符描述示例
&&逻辑与a && b
||逻辑或a || b
!逻辑非!a

示例:

int a = 1, b = 0;
int andResult = (a && b);  // 0 (false)
int orResult = (a || b);   // 1 (true)
int notResult = !a;        // 0 (false)

4. 位运算符

位运算符用于按位操作。

运算符描述示例
&按位与a & b
|按位或a | b
^按位异或a ^ b
~按位取反~a
<<左移a << 1
>>右移a >> 1

示例:

int a = 5, b = 3;
int andResult = a & b;  // 1
int orResult = a | b;   // 7
int xorResult = a ^ b;  // 6
int notResult = ~a;     // -6
int leftShift = a << 1; // 10
int rightShift = a >> 1; // 2

5. 赋值运算符

赋值运算符用于给变量赋值。

运算符描述示例
=赋值a = b
+=加并赋值a += b
-=减并赋值a -= b
*=乘并赋值a *= b
/=除并赋值a /= b
%=取模并赋值a %= b

示例:

int a = 10;

a = 5;
printf("a = 5 -> a = %d\n", a); // 5

a += 5;
printf("a += 5 -> a = %d\n", a); // 10

a -= 5;
printf("a -= 5 -> a = %d\n", a); // 5

a *= 2;
printf("a *= 2 -> a = %d\n", a); // 10

a /= 2;
printf("a /= 2 -> a = %d\n", a); // 5

a %= 3;
printf("a %%= 3 -> a = %d\n", a); // 2

6. 其他运算符

其他常见运算符还包括条件运算符(三元运算符)、逗号运算符、指针运算符等。

运算符描述示例
? :条件运算符condition ? a : b
,逗号运算符a = (b, c)
*指针运算符*ptr
&取地址运算符&a
条件运算符(三元运算符)

条件运算符用于根据一个条件表达式的真假来返回两个值中的一个。
可以用来替换if … else语句
int max = (a > b) ? a : b;
相当于
int max;if(a>b){max=a}else{max=b}
示例:

int a = 10, b = 20;
int max = (a > b) ? a : b; // 20
指针运算符

指针运算符用于处理指针。* 用于解引用指针,& 用于取变量的地址。

示例:

int a = 10;
int *p = &a; // p 是指向 a 的指针
printf("a = %d, *p = %d\n", a, *p); // 输出 "a = 10, *p = 10"
逗号运算符

逗号运算符用于在一个表达式中执行多个操作,从左到右依次执行,并返回最后一个操作的值。

示例:

int a, b;
a = (b = 3, b + 2); // b 先被赋值为 3,然后 a 被赋值为 b + 2,即 5
printf("a = %d, b = %d\n", a, b); // 输出 "a = 5, b = 3"

流程控制

流程控制语句用于控制程序的执行顺序,主要包括以下几种:

1. 条件语句

if 语句

一个if语句包含一个布尔表达式后跟一个或多个语句。
示例:

int a = 10;
if (a > 5) {
    printf("a is greater than 5\n"); // 输出 "a is greater than 5"
}
if-else 语句

一个if语句可以跟着一个可选的else语句,当布尔表达式是假的,其执行。
示例:

int a = 10;
if (a > 5) {
    printf("a is greater than 5\n");
} else {
    printf("a is less than or equal to 5\n");
}
else-if 语句

可以在另一个if or else if语句中使用一个if or else if语句。
示例:

int a = 10;
if (a > 5) {
    printf("a is greater than 5\n");
} else if (a == 5) {
    printf("a is equal to 5\n");
} else {
    printf("a is less than 5\n");
}

switch 语句

switch语句允许一个变量来针对值的列表平等进行测试。
以下规则适用于switch语句

  • switch语句中使用的表达式必须具有整数或枚举类型,或者是类类型,其中该类具有到整数或枚举类型的单个转换函数。
  • switch内可以有任意数量的case语句。每个case后面都跟要比较的值和一个冒号。
  • case的常量表达式必须与switch中的变量具有相同的数据类型,并且必须是常量或文字。
  • 当switch的变量等于case时,该case之后的语句将一直执行,直到到达break语句为止。
  • 当到达break声明,switch终止,并且控制流程跳转到以下switch语句中的下一行。
  • 并非每个case都需要break一下。直到达到switch最后的case如果没有switch的值出现控制流会落空。
  • 一个switch语句可以有一个可选的默认情况下,它必须出现在switch的最后。当所有情况都不为真时,可以使用默认情况来执行任务。在默认情况下,无需break
    示例:
int a = 2;
int a = 2;
switch (a) {
    case 1:
        printf("a is 1\n");
        break;
    case 2:
        printf("a is 2\n"); // 输出 "a is 2"
        break;
    case 3:
        printf("a is 3\n");
        break;
    default:
        printf("a is not 1, 2, or 3\n");
}

2. 循环语句

for 循环

语法

for ( init; condition; increment ) {
   statement(s);
}

这是“for”循环中的控制流程-

  • init步骤首先被执行,并且只有一次。此步骤允许您声明和初始化任何循环控制变量。
  • 接下来,测试condition。如果为true,则执行循环主体。如果为假,则不执行循环主体,并且控制流仅在“for”循环之后跳转到下一条语句。
  • 在“for”循环的主体执行之后,控制流跳回到increment语句。该语句允许您更新任何循环控制变量。
  • 现在将再次测试condition。如果为true,则循环执行并重复执行过程(循环主体,然后是递增步,然后再次是条件)。条件变为假之后,“for”循环终止。
    示例:
for (int i = 0; i < 10; i++) {
    printf("%d\n", i); // 输出 0 到 9
}
while 循环

语法

while(condition) {
   statement(s);
}

需要注意的是,while循环可能根本不执行。当测试条件第一次并且结果为false时,将跳过循环主体,并执行while循环之后的第一条语句。
示例:

int i = 0;
while (i < 10) {
    printf("%d\n", i); // 输出 0 到 9
    i++;
}
do-while 循环

语法

do {
   statement(s);
} while( condition );

与for和while循环不同,for和while循环在循环的顶部测试循环条件,而C语言中的do … while循环在循环的底部检查其条件。do…while循环类似于while循环,但事实上,它是保证执行至少一次。
示例:

int i = 0;
do {
    printf("%d\n", i); // 输出 0 到 9
    i++;
} while (i < 10);

嵌套循环

嵌套循环是指一个循环体内再包含一个或多个循环。常用于多维数据的处理,如二维数组等。
语法

for ( init; condition; increment ) {

   for ( init; condition; increment ) {
      statement(s);
   }
   statement(s);
}

示例

#include <stdio.h>

int main() {
    for (int i = 1; i <= 3; i++) {         // 外层循环
        for (int j = 1; j <= 3; j++) {     // 内层循环
            printf("i = %d, j = %d\n", i, j);
        }
    }
    return 0;
}

死循环

死循环(无限循环)是一个永远不会终止的循环。除非在循环体内部使用控制语句(如 breakreturn)强制跳出循环,否则程序会一直运行下去。

示例:

使用 while 死循环:

#include <stdio.h>

int main() {
    while (1) {
        printf("This is an infinite loop.\n");
    }
    return 0; // 这行代码永远不会执行
}

使用 for 死循环:

#include <stdio.h>

int main() {
    for (;;) {
        printf("This is an infinite loop.\n");
    }
    return 0; // 这行代码永远不会执行
}

3. 跳转语句

break 语句

终止循环或switch语句,并在循环或switch后立即将执行的语句。
示例:

for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break;
    }
    printf("i: %d\n", i);
}

continue 语句

使循环跳过其其余部分,并在重新进行迭代之前立即重新测试条件。
示例:

for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue;
    }
    printf("i: %d\n", i);
}

return 语句

用于结束函数并返回一个值或者结束循环。
示例:

int sum(int a, int b) {
    return a + b;
}
goto 语句

将控制权转移到带标签的语句。不常用,会影响代码阅读

示例:


#include <stdio.h>

int main () {
   int a = 10;
   LOOP:do {
      if( a == 15) {
         a = a + 1;
         goto LOOP;
      }
                
      printf("value of a: %d\n", a);
      a++;

   }while( a < 20 );
 
   return 0;
}

每日练习

  1. 编写一个程序,演示各种运算符的使用
#include <stdio.h>

int main() {
    int a = 10, b = 5;

    // 算术运算符
    printf("a + b = %d\n", a + b); // 15
    printf("a - b = %d\n", a - b); // 5
    printf("a * b = %d\n", a * b); // 50
    printf("a / b = %d\n", a / b); // 2
    printf("a %% b = %d\n", a % b); // 0

    // 关系运算符
    printf("a == b = %d\n", a == b); // 0
    printf("a != b = %d\n", a != b); // 1
    printf("a > b = %d\n", a > b);   // 1
    printf("a < b = %d\n", a < b);   // 0
    printf("a >= b = %d\n", a >= b); // 1
    printf("a <= b = %d\n", a <= b); // 0

    // 逻辑运算符
    int x = 1, y = 0;
    printf("x && y = %d\n", x && y); // 0
    printf("x || y = %d\n", x || y); // 1
    printf("!x = %d\n", !x);         // 0

    // 位运算符
    printf("a & b = %d\n", a & b);   // 0
    printf("a | b = %d\n", a | b);   // 15
    printf("a ^ b = %d\n", a ^ b);   // 15
    printf("~a = %d\n", ~a);         // -11
    printf("a << 1 = %d\n", a << 1); // 20
    printf("a >> 1 = %d\n", a >> 1); // 5

    // 赋值运算符
    a += 5;
    printf("a += 5 -> a = %d\n", a); // 15
    a -= 5;
    printf("a -= 5 -> a = %d\n", a); // 10
    a *= 2;
    printf("a *= 2 -> a = %d\n", a); // 20
    a /= 2;
    printf("a /= 2 -> a = %d\n", a); // 10
    a %= 3;
    printf("a %%= 3 -> a = %d\n", a); // 1

    // 其他运算符
    int max = (a > b) ? a : b;
    printf("max = %d\n", max); // 10

    return 0;
}

运行结果

a + b = 15
a - b = 5
a * b = 50
a / b = 2
a % b = 0
a == b = 0
a != b = 1
a > b = 1
a < b = 0
a >= b = 1
a <= b = 0
x && y = 0
x || y = 1
!x = 0
a & b = 0
a | b = 15
a ^ b = 15
~a = -11
a << 1 = 20
a >> 1 = 5
a += 5 -> a = 15
a -= 5 -> a = 10
a *= 2 -> a = 20
a /= 2 -> a = 10
a %= 3 -> a = 1
max = 5
  1. 编写一个程序,使用嵌套 for 循环打印九九乘法表。
#include <stdio.h>

int main() {
    for (int i = 1; i <= 9; i++) {           // 外层循环
        for (int j = 1; j <= 9; j++) {       // 内层循环
            printf("%d * %d = %2d\t", i, j, i * j);
        }
        printf("\n");
    }
    return 0;
}

运行结果

1 * 1 =  1
2 * 1 =  2      2 * 2 =  4
3 * 1 =  3      3 * 2 =  6      3 * 3 =  9
4 * 1 =  4      4 * 2 =  8      4 * 3 = 12      4 * 4 = 16
5 * 1 =  5      5 * 2 = 10      5 * 3 = 15      5 * 4 = 20      5 * 5 = 25
6 * 1 =  6      6 * 2 = 12      6 * 3 = 18      6 * 4 = 24      6 * 5 = 30      6 * 6 = 36
7 * 1 =  7      7 * 2 = 14      7 * 3 = 21      7 * 4 = 28      7 * 5 = 35      7 * 6 = 42      7 * 7 = 49
8 * 1 =  8      8 * 2 = 16      8 * 3 = 24      8 * 4 = 32      8 * 5 = 40      8 * 6 = 48      8 * 7 = 56      8 * 8 = 64
9 * 1 =  9      9 * 2 = 18      9 * 3 = 27      9 * 4 = 36      9 * 5 = 45      9 * 6 = 54      9 * 7 = 63      9 * 8 = 72      9 * 9 = 81

标签:语句,示例,--,C语言,运算符,int,循环,printf
From: https://blog.csdn.net/2401_86274572/article/details/140869808

相关文章

  • Applescrip成功实现FaceTime蓝号检测,检测是否开通FaceTime功能的实现原理
    FaceTime是苹果公司iOS和macOS(以前称MacOSX或OSX)内置的一款视频通话软件,通过Wi-Fi或者蜂窝数据接入互联网,在两个装有FaceTime的设备之间实现视频通话。其要求通话双方均具有装有FaceTime的苹果设备,苹果ID以及可接入互联网的3G/4G/5G或者Wi-Fi网络。一、Windows电脑上部署......
  • 双向链表的实现
    1、双向链表示意图 2、双向链表实现(1)结构体定义typedefintLTDataType;typedefstructListNode{ LTDataTypedata; structListNode*prev; structListNode*next; }LTNode;(2)初始化/****************初始化*****************/LTNode*ListInit(LTNode*phead......
  • HarmonyOS:如何实现自定义的Tabs,TabContent内部实现如何动态配置
    前言:最近做开发任务的时候,想把Tabs自定义了,并且动态配置TabContent里面的内容,不是写死一样的,这个问题困扰了很长时间,试过**@BuilderParam**(类似于vue的插槽)传组件方式的,但是**@BuilderParam只能传一个,我想要传递的是一个数组,找了很多Api最后找到了WrappedBuilder[]**这种方......
  • Qt C++ 调用 Python 之 PyObject* 数据类型转换
    整数:PyLong_FromLong和PyLong_AsLong类型检查函数:PyLong_Check()intcppInt=42;//C++整数转换为Python整数对象PyObject*pyInt=PyLong_FromLong(cppInt);//Python整数对象转换为C++整数longcppIntFromPy=PyLong_AsLong(pyInt);Py_DECREF(pyInt)......
  • JAVA中实现队列和栈(Deque接口和ArrayDeque类)
    用什么来实现队列和栈首先JAVA中有一个Queue接口,用来实现队列。Deque其实就是双端队列,代表两端都可进可出的队列。ArrayDeque就是用数组来实现这个双端队列。(Deque由于是接口,只可以用于声明对象,但是没办法实例化,实例化还是要使用ArrayDeque类)这时可能就会产生疑惑,队列有了,......
  • 达梦数据库系列—44.SQL调优
    目录SQL优化思路1、定位慢sql2、SQL分析方法2.1执行计划2.2ET工具2.3dbms_sqltune工具3、SQL语句优化3.1索引3.2SQL语句改写3.3表设计优化3.4表的连接方式3.5HINT4、统计信息SQL优化思路1、定位慢sql待优化的SQL大致可分为两类:1、SQL执行时间在十......
  • SSM餐饮管理系统uto0o 系统界面在最后
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,员工,桌台信息,桌台预订,菜品信息,点菜订单,盈利统计,菜品分类开题报告内容一、选题背景随着社会经济的快速发展和人们生活水平的提高,餐饮行业迎......
  • Linux raid基本使用
    Linux内核中有一个md(multipledevices)模块在底层管理RAID设备,它会在应用层给我们提供一个应用程序的工具mdadm,mdadm是linux下用于创建和管理软件RAID的命令将lv组成raid-Ccreate创建-vverbose现实详细信息-llevel级别,raid级别-nlv的数量raid0mdadm-C-v......
  • 在 Go 中,`fmt.Printf` 常用的 `%` 占位符类型
    在Go中,fmt.Printf常用的%占位符类型如下:%v:值的默认格式表示。%+v:结构体字段名和值的格式表示。%#v:Go语法表示的值。%T:值的类型。%%:百分号字面量。对于特定类型:%d:整数(十进制)。%b:整数(二进制)。%o:整数(八进制)。%x,%X:整数(十六进制)。%f:浮点数。%e,%E:科学......
  • vue同时校验多个表单
    最开始的想法是将两个表单绑定同一个ref,这样在调用ref.value.validate()是否可以同时校验两个表单呢?(1)修改两个表单同时绑定formARef,点击按钮进行校验:只有第二个表单进行校验了,这是因为在Vue3中,使用ref绑定表单元素时,如果你给两个不同的表单元素都绑定了相同的ref,例如re......