IDE推荐
个人推荐小熊猫C++,下载后无需配置即可上手使用,当学到一定阶段或者有做中大型项目的需求,再考虑切换到Visual Studio,零基础直接使用Visual Studio,会沉迷于代码之外的事物,比如安装、配置和理解解决方案是什么。
小熊猫C++是国内作者专门为初学者开发的一款IDE,改进自Dev C++,无需任何配置,打开即用。
官网链接:小熊猫C++ (gitee.io)
下载带编译器MinGW-w64的版本,不要下载无编译器版。7z版解压即可用,exe版需要安装。
安装打开后默认选择的是C盘的文档目录,建议选择工作文件夹到自己新建的目录。
1、理解标识常量define
C 语言中,可以用 #define(也可以叫宏) 定义一个标识符来表示一个常量,用 #define 定义标识常量的一般形式为:
#define PI 3.14
#define MAX_VALUE 65535
凡是以 # 开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。好处是在编译期帮我们处理了部分程序的设置,提升运行期的速度。
下面看这样一段代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX(a, b) (a) > (b) ? (a) : (b)
int main()
{
int i = 5, j = 3;
printf("i = %d, j = %d\n", i, j);
printf("MAX输出的值:%d\n", MAX(i++, j++));
printf("i = %d, j = %d\n", i, j);
exit(0);
}
直接编译运行后,得到的结果跟想象的不同。下面是小熊猫C++运行后的结果:
查看一下预编译的结果:
本地查看:
gcc命令不识别的话,可以通过绝对路径使用小熊猫C++里的:
或者使用Compiler Explorer (godbolt.org)在线查看:
可以看到define宏体是原封不动的替换到代码里的: (i++) > (j++) ? (i++) : (j++),程序运行后的判断让i值自增了2次。
解决方法:
// 第一种
#include <stdio.h>
#include <stdlib.h>
#define MAX(a, b) ({int A = a, B = b; (A) > (B) ? (A) : (B);})
int main()
{
int i = 5, j = 3;
printf("i = %d, j = %d\n", i, j);
printf("MAX输出的值:%d\n", MAX(i++, j++));
printf("i = %d, j = %d\n", i, j);
exit(0);
}
// 第二种,优化为使用typeof(a)来动态确定A、B的类型
#include <stdio.h>
#include <stdlib.h>
#define MAX(a, b) ({typeof(a) A = a, B = b; ((A) > (B) ? (A) : (B));})
int main()
{
int i = 5, j = 3;
printf("i = %d, j = %d\n", i, j);
printf("MAX输出的值:%d\n", MAX(i++, j++));
printf("i = %d, j = %d\n", i, j);
exit(0);
}
有出现警告的,可以取消勾选严格检查是否遵守标准
编译运行后的结果:
预编译结果: