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

C语言遇见的一些小问题

问题如下:

1:为什么这样的代码为报错

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <cstdio>
#include<string>
#include<stdlib.h>
using namespace std;
int main()
{
	int i = 7; printf("%d\n", i++ * i++);//49
	int a[10] = {0};
	for (i = 0; i < 10; i++)
	{
		cout << a[i] << endl;
	}
	a[i] = i++;
	printf("%d",a[i]);
	return 0;
}

通过调试发现问题出在for循环后i此时为10,a[10]就已经数组越界了,因此a[i]是a[10]不是a[7],打印的a[i]是错误值 

4c3e9cc124f04e7d9de61ac0336fb1d9.png

 

 2: 下面的代码 int i=7; printf("%d\n", i++ * i++); 返回 49?不管按什么顺序计算, 难道不该打印出56吗?

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <cstdio>
#include<string>
#include<stdlib.h>
int main()
{

	int i = 7; printf("%d\n", i++ * i++);//49		
	return 0;
}

87e494b4deee440b9f223085fa131459.png

问题解释:

参考书籍《你必须知道的495个C语言问题》

        后置++和后置--是先使用再自增自减,没有任何保证确保自增或自减会在输出变量原值之 后和对表达式的其它部分进行计算之前立即进行。也不能保证变量的更新会在表 达式 “完成”) 之前 的某个时刻进行。本例中, 编译器选择使用变量的旧值相乘以后再对二者进行自 增运算。

包含多个不确定的副作用的代码的行为总是被认为未定义。(简单而言, “多 个不确定副作用” 是指在同一个表达式中使用导致同一对象修改两次或修改以后 又被引用的自增, 自减和赋值操作符的任何组合。

        我们不需要探究这些在编译器中是如何实现的,但要知道后置++,后置--与前置++,前置--的区别。

3:对于代码 int i = 3; i = i++; 不同编译器给出不同的结果, 有的为 3, 有的为 4, 哪个是正确的?

在VS2022编译器上结果为4

0062ff13726948acb95dc41d5dc91a9d.png

但不一定每个编译器都是4。i++ 和 ++i 都不同于 i+1。如果你要使 i 自增 1, 使用 i=i+1, i+=1, i++ 或 ++i, 而不是任何组合。

4:我可否用括号来强制执行我所需要的计算顺序?

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <cstdio>
#include<string>
#include<stdlib.h>
int f()
{
	return 2;
}
int g()
{
	return 3;
}
int h()
{
	return 4;
}
int main()
{
	int a = f() + g() * h();
	printf("%d\n", a);
	return 0;
}

78659434160946dba1be6ef706495cba.png

我们知道*运算符优于+运算符,但f(),g(),h()函数哪一个先被调用呢,通过调试我发现调用顺序先f(),接着g(),最后h()。如果运算表达式为f()+h()*g()则先f(),再h()最后g()。

873c6c1737cc4bdb96c848867828e136.gif

 

 

 


http://www.kler.cn/a/288272.html

相关文章:

  • 玩转ChatGPT:文献阅读 v2.0
  • C/C++语言基础--C++模板与元编程系列六,C++元编程相关库的讲解与使用
  • 项目技术栈-解决方案-web3去中心化
  • SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间
  • 代码修改材质参数
  • 搭建Python2和Python3虚拟环境
  • 使用实例:xxl-job应用在spring cloud微服务下
  • MySQL——事务与存储过程(三)存储过程的使用(1)调用存储过程
  • Unity(2022.3.41LTS) - 3D动画
  • 在 Docker 中配置 npm 和 pnpm 使用镜像源
  • np.ndarray和np.array区别;MXNet的 mx.array 类型是什么;NDArray优化了什么:并行计算优化
  • uniapp钱包支付、与设置密码页面
  • 读书笔记:《深入理解Java虚拟机》(9)
  • Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(Python)
  • java导出Excel接口
  • 32位CPU中,实现32位无符号乘法,返回64位无符号数据。原理解析。
  • oracle expdp/impdp 迁移数据库
  • 数学基础 -- 图像处理之Sobel卷积核推导过程
  • C++STL~~list
  • Day21—爬虫性能优化技巧
  • 自动化仓储系统:知识汇总
  • 将语义分割的标签转换为实例分割(yolo)的标签
  • vim和nano的基础教程(很基础的那种)
  • wordcloud兼figma的词云图片python生成
  • 情感共鸣:数业智能心大陆重塑AI心理交互新纪元
  • Github 2024-09-03 Python开源项目日报 Top10