当前位置: 首页 > wzjs >正文

城阳网站建设哪家好百度爱采购优化排名软件

城阳网站建设哪家好,百度爱采购优化排名软件,无锡网站app微信号,抖音关键词排名查询问题一、如何理解 sizeof(s a 2) &#xff08;来源&#xff1a;C语言的——操作符详解——&#xff08;第18篇&#xff09;&#xff09; (以下内容是deepseek结果&#xff1a;有助于基础阶段理解&#xff0c;后续再深入学习) #include <stdio.h>int main() {short …

问题一、如何理解 sizeof(s = a + 2)   (来源:C语言的——操作符详解——(第18篇)

(以下内容是deepseek结果:有助于基础阶段理解,后续再深入学习)

#include <stdio.h>int main()
{short s = 5;int a = 10;printf("%d\n", sizeof(s = a + 2));  //结果:2   //sizeof 括号中的表达式是不参与运算的!printf("%d\n", s);   //结果:5return 0;
}//s = a + 2 不会发生“整型提升”
//因为 s = a + 2 并没有运算//赋值表达式 s = a + 2 是在“编译阶段”处理的//test.c  ------------------------- test.exe
//源文件  ------------------------> 可执行程序
//编译器  ---------> 链接 --------> 运行//sizeof(s=a+2) 在编译时,就已经处理完了//printf("%d\n",s); 在运行阶段才处理
//s = a + 2 在编译阶段就处理完了
//printf("%d\n",sizeof(s=a+2)); 在编译阶段被处理成 printf("%d\n",2); 进入运行阶段的
//所以表达式 s = a + 2 是不会被运算的。

一、程序执行全景图

mermaid

graph TDA[程序启动] --> B[加载可执行文件]B --> C[跳转至main函数]C --> D[声明局部变量]D --> E[执行printf("%d\n", sizeof(s=a+2))]E --> F[执行printf("%d\n", s)]F --> G[return 0]G --> H[程序终止]

二、运行时执行细节(重点解析)

1. ​程序初始化阶段
  • 栈内存分配
  • struct StackFrame {short s;  // 2 bytesint a;    // 4 bytesreturn_addr; // 8 bytes(平台相关)
    };
  • 变量初始化
    • s:直接存储5(0x05
    • a:直接存储10(0xA
2. ​第一个printf的执行流程
printf("%d\n", sizeof(s = a + 2));
  • 编译时处理​(已转化为):
    printf("%d\n", sizeof(short)); 
  • 运行时机器码

    asm

    mov eax, 2          ; sizeof(short)=2
    push eax             ; 参数压栈
    mov edi, fmt_str     ; "%d\n"地址
    call printf          ; 调用函数
    add esp, 8          ; 清理栈
  • 关键点
    • 完全没有执行s = a + 2的机器码
    • 直接将类型大小2作为参数
3. ​第二个printf的执行流程
printf("%d\n", s);
  • 运行时机器码
    asm
    mov eax, s          ; 加载s的值5
    push eax             ; 参数压栈
    mov edi, fmt_str     ; "%d\n"地址
    call printf          ; 调用函数
    add esp, 8          ; 清理栈
  • 变量状态
    • s仍为初始化值5
    • a仍为10(未被修改)

三、编译阶段深度解析

1. ​语法树变换
  • 原始表达式
    sizeof(s = a + 2)
  • 编译器处理步骤
    1. 类型推断
      • a的类型为int2的类型为int
      • a + 2的类型为int
      • 赋值目标s的类型为short
      • 整个表达式类型为short &(左值引用)
    2. 常量折叠
      • 计算sizeof(short) → 2
    3. 死代码消除
      • 删除s = a + 2的赋值操作
2. ​生成的中间表示(IR)​

llvm

; sizeof(s = a + 2) 的编译器优化后表示
%0 = alloca i16, align 2        ; s的栈分配(未使用)
%1 = alloca i32, align 4         ; a的栈分配(未使用)
%size = call i32 @sizeof(i16)     ; 直接计算sizeof(short)
call void @printf(i8*..., i32 %size) 
  • 关键观察
    • 完全没有与s = a + 2相关的指令
    • alloca分配的栈空间未被使用(优化器可能直接删除)

四、标准条款与编译器行为

1. ​C11标准关键条款
  • ​**§6.7.7 The sizeof operator**:

    The sizeof operator yields the size (in bytes) of the object representation of the type of its operand.
    (sizeof运算符返回其操作数类型的对象表示的大小(以字节为单位)。)

  • ​**§6.7.6 Assignment operators**:

    An assignment operator shall have an lvalue as its left operand.
    (赋值运算符的左操作数必须是一个左值。)

2. ​编译器行为规范
  • GCC编译器
    // -O0(无优化)下仍然会删除未使用的赋值
    warning: statement with no effect [-Wunused-value]
  • Clang编译器
    // -Wall下给出警告
    warning: expression result unused [-Wunused-value]

五、扩展案例对比分析

案例1:带副作用的sizeof
int *p = NULL;
sizeof(p = malloc(100)); // 返回8(指针大小),p仍为NULL
  • 编译器处理
    • 分析表达式类型int * &(指针的左值引用)
    • 计算sizeof(int *) → 8
    • 保留malloc(100)的调用(副作用可能被使用)
案例2:条件编译中的sizeof
if (sizeof(s = a + 2)) { // 此时s会被赋值!// 因为条件表达式需要求值副作用
}
  • 编译器处理
    • 必须执行s = a + 2以确定条件真假
    • 此时s的值变为12(10 + 2)

六、最终执行时序表

程序计数器(PC)操作寄存器/内存变化
0x1000main函数入口RIP=0x1000
0x1004alloc stack space for s/aSP=0x1000-0x18
0x1008mov word [s], 5s=5
0x100Cmov dword [a], 10a=10
0x1010mov eax, 2准备sizeof结果
0x1012push eax栈压入2
0x1014lea rdi, [fmt_str]RDI指向"%d\n"
0x1018call printf输出2
0x101Dadd rsp, 8清理栈
0x1020mov eax, [s]加载s的值5
0x1023push eax栈压入5
0x1025lea rdi, [fmt_str]RDI再次指向"%d\n"
0x1028call printf输出5
0x102Dmov eax, 0return 0
0x1032ret程序终止

总结

  1. 编译时与运行时的严格分离

    • sizeof的参数类型在编译时确定
    • 实际赋值操作s = a + 2属于运行时行为,但在此处被编译器优化消除
  2. 表达式求值的本质区别

    • 语法分析阶段:确定表达式类型(short &
    • 语义分析阶段:检查类型兼容性(int → short隐式转换)
    • 优化阶段:删除未使用的副作用(s = a + 2的赋值)
  3. 内存操作的可视化

    • 栈帧布局明确显示局部变量分配
    • 没有修改s的存储位置(0x1008处的初始化后未被覆盖)
  4. 标准与实现的完美统一

    • 编译器行为严格符合C11标准规定
    • 警告信息提示未使用值的编程实践问题

这个案例展示了C语言"编译型"特性的精髓:开发者需要同时理解语法语义和编译器优化策略,才能准确预测代码行为。通过这种分层的解析方式,可以更深入地掌握C语言的底层工作原理。

http://www.dtcms.com/wzjs/834204.html

相关文章:

  • 网站建设需要什么资料网站建设哪里最好
  • .net网站模板wordpress百度地图开发
  • 网站图怎么做商务网站开发方式
  • 网页站点设计电子书籍网站开发
  • 艺腾青岛网站建设越南人一般去哪个网站做贸易
  • 非法网站开发是什么意思网页设计跟网站建设
  • 南昌公司建设网站费用微信小程序如何搭建
  • 视频分销网站建设网络营销外包推广渠道
  • 江西建设局网站织梦手机端网站字体重叠
  • 京东网站难做吗网站开发主要学些什么软件
  • 为什么中国人都跑去泰国做网站网站创建网站是怎么赚钱
  • 湖南做网站 尖端磐石网络asp网站上哪做
  • 外链网站wordpress %2$s
  • 北京网站建设流程网络商城应该如何推广
  • 成都市建设局权益卡网站备案域名购买交易
  • html5网站链接标签海外网络推广技巧
  • 合肥瑶海区寒假兼职工网站建设南京网站建设
  • 眉山建设银行官方网站毕业设计做网站有哪些方面
  • 太原市建设工程安全监督站网站网络规划与设计教程
  • 做电影数据的网站营销网址
  • 建设银行嘉兴分行官方网站有哪些网站做的很好
  • 如何高效建设品牌网站青岛做网站好的公司
  • 中国建设银行网站首页企业盘多多百度网盘搜索引擎
  • 机关网站建设存在的问题合肥网站制作建设公司
  • 网站开发是叫系统吗珠海集团网站建设报价
  • 浙江电信关于网站备案信息核实的公告温州市微网站制作电话
  • 如何百度搜到网站上海网站设计哪家强
  • 电子商务网站建设需求说明书军事最新军事新闻视频
  • 今科云平台网站建设技术宁夏建设厅网站官网
  • 网站规划内容企业宣传片报价