逗号表达式与赋值表达式

简介: 逗号表达式与赋值表达式

       逗号表达式和赋值表达式是C语言中常用的表达式类型。它们可以用于各种目的,包括计算和评估表达式、初始化变量、为函数调用提供参数以及将值分配给变量。

逗号表达式

       逗号表达式允许在单个语句中计算和评估多个表达式。逗号分隔每个表达式,并且表达式从左到右依次执行。逗号表达式可以用于以下目的:

  1. 将多个表达式组合为一个语句。
  2. 初始化多个变量。
  3. 为函数调用提供多个参数。
  4. 将值分配给多个变量。

逗号表达式运算法则

  • 逗号表达式从左到右依次执行。
  • 逗号表达式中,每个表达式都独立计算和评估
  • 逗号表达式中,每个表达式的值都会被丢弃除了最右边的表达式
  • 逗号表达式的值是其最右边的表达式的值

以下是一些逗号表达式运算法则的示例:

int i = 1, j = 2, k = 3; // 初始化三个变量

printf("%d, %d, %d\n", i, j, k); // 输出三个变量的值


 逗号表达式中,每个表达式都独立计算和评估:

int a = (1 + 2), b = (3 + 4), c = (5 + 6); // 计算三个表达式的值   a=3,b=7,c=11


 逗号表达式中,每个表达式的值都会被丢弃,除了最右边的表达式:

int d = (1, 2, 3); // 逗号表达式中,只有最右边的表达式 3 的值会被保留,d最终等于3


逗号表达式的值是其最右边的表达式的值:

int e = (1, 2 + 3, 4 * 5); // e 的值是 20

练习:

求下面代码的结果 :

#include <stdio.h>
int main()
{
    int arr[] = {1,2,(3,4),5};
    printf("%d\n", sizeof(arr));
    return 0;
} 

答案:16

分析:(3,4)逗号表达式,从左往右计算,表达式最终结果是4。sizeof计算数组大小(sizeof:https://blog.csdn.net/wait___wait/article/details/135184125?spm=1001.2014.3001.5502,单位字节,int类型字节为4,数组有4个元素,因此大小为4*4=16。

赋值表达式

       赋值表达式用于将值分配给变量。赋值运算符“=”用于将右边的值分配给左边的变量(操作符:赋值运算符https://blog.csdn.net/wait___wait/article/details/135242898)。赋值表达式可以用于以下目的:

  • 将常量或变量的值分配给变量。
  • 将函数调用的返回值分配给变量。
  • 将表达式计算的结果分配给变量。

以下是一些赋值表达式的示例:

int i = 1; // 将值 1 赋值给变量 i

i += 2; // 将值 2 加到变量 i 上,  i等于3,i+=2相当于i=i+2,是复合赋值

易混淆点        

举例说明:

#include <stdio.h>
int main()
{
    int a, b, c;
    a = 5;
    c = ++a;
    b = ++c, c++, ++a, a++;
 
    b += a++ + c;
    printf("a = %d b = %d c = %d\n:", a, b, c);
    return 0;
} 

答案:a = 9 b= 23 c = 8

答案解析:

++运算符:分为前置++和后置++https://blog.csdn.net/wait___wait/article/details/135242898

前置++:先加1,后使用,即先使用变量中内容,然后给结果加1

后置++:先使用变量中内容,整个表达式结束时,给变量加1

c = ++a;// ++a:a+1,结果为6,加完之后的结果用来赋值给c,因此:a = 6 c = 6

b = ++c, c++, ++a, a++;

  // 逗号表达式的优先级最低,要想先执行可利用(),这里先算b=++c, b得到的是++c后的结果,b是7

  // b=++c 和后边的构成逗号表达式,相当于   (b=++c),c++, ++a, a++    依次从左向右计算的。

  // 表达式结束时,c++和,++a,a++会给a+2,给c加1,此时c:8,a:8,b:7

b += a++ + c; // a先和c加,结果为16,在加上b的值7,b的结果为23,最后给a加1,a的值为9

练习:

#include<stdio.h>
int main()
{
    int a, b;
    b = (a = 1,a + 1, ++a);
    printf("a = %d b = %d", a, b);
    return 0;
} 

先自己分析一下

答案:a = 2 b = 2

解析: b = (a = 1,a + 1, ++a)先执行逗号表达式再执行赋值表达式,逗号表达式的最终结果是a等于2,后a的值赋给b。


期待


目录
相关文章
|
网络协议 数据安全/隐私保护 网络虚拟化
深入了解OSI模型:计算机网络的七大层次
OSI模型 OSI模型是一个网络通信的概念模型,用于描述计算机网络中各个不同层次之间的通信和功能。它将网络通信分为七个不同的层次,每个层次负责不同的任务,使得网络通信的设计、开发和管理更加模块化和可维护。以下是OSI模型的七个层次以及它们的主要功能: 1、物理层(Physical Layer): 功能:处理物理传输介质上的原始比特流,确保数据在传输媒体上能够以适当的方式传输。 示例设备:集线器、中继器、网线等。 主要任务:比特编码、电压规范、物理拓扑等。 2、数据链路层(Data Link Layer): 功能:负责将原始比特流分割成帧并添加地址信息,以便在直接连接的设备之间传输数据。 示例设
5118 0
|
4月前
|
人工智能 安全 数据安全/隐私保护
Hermes Agent 登顶 OpenRouter 调用量第一,Agentic AI 时代已不可逆转
2026年5月,Hermes Agent以日均2710亿Token调用量登顶OpenRouter榜首,超越OpenClaw。其核心优势在于“越用越聪明”的自学习架构、三层记忆系统、零CVE安全设计,以及抓住OpenClaw创始人离任的生态窗口期,10周获11万GitHub Stars,标志Agentic AI正式进入生产级应用时代。
783 2
|
5月前
|
SQL 人工智能 API
一个人干五个人的活?Copilot CLI 的 `/fleet` 让你体验“影分身术“
GitHub Copilot CLI 新增 `/fleet` 命令,化身“AI包工头”,智能拆解需求、调度多子代理并行处理跨文件任务(如重构+测+文档),支持依赖编排与实时监工。提升开发效率,助你从执行者进阶为指挥官!
385 0
|
8月前
|
弹性计算 容灾 定位技术
阿里云服务器ECS哪些地区有节点?全球地域汇总,开服运营20地域、80可用区
阿里云ECS已覆盖全球四大洲20+地域、80+可用区,含中国华北、华东、华南等10+地域及海外新加坡、东京、法兰克福等15+地域。支持多可用区容灾部署与低延迟内网通信,满足不同业务对地理位置、合规性及高可用的需求。
1234 13
|
8月前
|
人工智能 Cloud Native 安全
2026年主流服务器性能测试工具对比分析与选型建议
文章围绕2026年主流服务器性能测试工具展开,介绍行业趋势、痛点及解决方案,对比优测、JMeter、LoadRunner等工具的优劣,阐述技术原理,给出选型建议并解答常见问题,助力企业根据自身情况选型。
|
存储 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:成本优化-软硬协同篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以超越原记录2.5倍的性能登顶排行榜,实现每分钟20.55亿笔交易,单位成本仅0.8元人民币,刷新性能与性价比双纪录。此外,还介绍了国产轻量版PolarDB MySQL的推出,满足市场对高性价比的需求。
|
数据安全/隐私保护
JumpServer的权限管理
文章介绍了JumpServer的权限管理操作,包括如何创建授权规则和验证授权是否成功。
811 2
|
机器学习/深度学习 资源调度 算法
深度学习原理篇 第六章:DETR
简要介绍DETR的原理和代码实现。
1309 0
|
Java 索引
java8流处理器list转map的对比
java8流处理器list转map的对比

热门文章

最新文章