谈VS2012平台下 += 与 ++ 的关系

本文通过几个具体的示例,详细解析了C++中++与+=运算符的混合使用情况,并对比了不同编译器下的执行结果,揭示了微软编译器与GCC编译器在处理这类运算时的不同行为。
今天闲来无事,再次调试这个问题,发现微软的编译器还真是奇葩,经常遇到++与+=的混合计算,如下:
	int a=1, b=3, c=10;
	int e, f;
	int d = 5;
	++d += (e=++d) + c; (1)
	d +=(e=d++) + c; (2)
	++d +=(e=d++) + c; (3)
	cout << d << “ ”<<e<< endl;

分别对上述三种进行测试得到的结果分别为(1)24 7   (2)21 5  (3)23 6

以上结果的得出的计算步骤如下:

    ++d += (e=++d) + c; //1.++d->d=6 2.++d->d=7 3.d=d+d=14 4.d=14+10=24
    d +=(e=d++) + c; //1.d=d+d=10 2.d=10+10=20 3. d=20+1=21
    ++d +=(e=d++) + c; //1.d=++d=6 2. d=d+d=12 3.d=12+10=22 4.d=22+1=23
总结一下就是,如果有val++,先计算+=的表达式 ,最后再计算val=val+1;如果是++val,先计算val=val+1,然后计算+=的表达式。

如第一例:先计算++d=》d=6,然后再计算++d=》d=7,接着就计算+=表达式就是d=7+7=14,最后计算d=14+10,其实最后两步可以算做一步。

后期再测试Linux下gcc编译器的结果。。。


<think>首先,用户的问题是:“我想了解makefile中CFLAGS += -I/CFLAGS += -I的区别 请问makefile里CFLAGS += -I/和CFLAGS += -I的区别” 我需要基于提供的引用和系统指令来回答。用户提供了三个引用: - 引用[1]:讨论Makefile中的宏定义,如EXTRA_CFLAGS += -D vs CONFIG_DEBUG=y,解释前者用于.c文件,后者用于Makefile编译。 - 引用[2]:解释DEBUG = dwarf-2在Makefile中的含义,以及如何应用到CFLAGS中。 - 引用[3]:展示CFLAGS += -O2导致的问题,以及使用volatile修饰来解决数据同步异常。 用户的问题是具体关于CFLAGS += -I/ vs CFLAGS += -I的区别。问题中提到的选项是-I,这是GCC编译器的选项,用于指定头文件的搜索路径。 关键点: - -I选项:在GCC中,-I用于添加包含目录。例如,-I/path/to/include告诉编译器在指定的路径中搜索头文件。 - 用户提到的是CFLAGS += -I/ vs CFLAGS += -I。 - CFLAGS += -I/:这看起来是-I后面跟着一个目录路径,但路径是空的或只有根目录"/"。在Makefile语法中,-I/ 表示添加根目录作为包含路径。这可能不是意图,因为根目录通常不是头文件的位置。 - CFLAGS += -I:这似乎是-I后面没有指定路径,这不完整,会导致错误,因为-I需要一个目录参数。 在Makefile中,当我们写CFLAGS += -I/path,它添加一个包含路径。标准的用法是CFLAGS += -I路径,其中路径是目录名称。 区别: 1. **CFLAGS += -I/**:这添加根目录 ("/") 作为包含路径。在Linux系统中,根目录包含系统头文件,但通常我们不直接使用它,因为系统头文件默认在标准路径中。添加根目录可能不是必要的,甚至可能引起混乱,因为它包含所有文件。 2. **CFLAGS += -I**:这无效,因为-I选项需要一个参数。-I后必须跟着一个路径。如果在Makefile中写CFLAGS += -I,编译器会报错,因为缺少目录名称。 所以,主要区别是: - -I/ 指定路径为根目录。 - -I 后面没有路径,是错误的语法。 在用户的问题中,它写的是“CFLAGS += -I/”和“CFLAGS += -I”,但可能用户意在比较CFLAGS += -Ipath vs something else, but from the text, it's explicitly about -I/ vs -I. 在引用中,没有直接提到-I选项的区别,但引用[2]和[3]涉及CFLAGS的使用: - 引用[2]:CFLAGS += -g$(DEBUG),其中DEBUG被定义。 - 引用[3]:CFLAGS += -O2 导致问题。 我需要回答核心问题:CFLAGS += -I/ 和 CFLAGS += -I 的区别。 结构化回答: 1. **解释-I选项的作用**:-I是编译器选项,用于添加头文件搜索路径。 2. **详细说明CFLAGS += -I/**:这添加根目录作为包含路径。示例:如果头文件在/include下,应该写-I/include,而不是-I/。 3. **详细说明CFLAGS += -I**:这会导致编译错误,因为-I需要参数。示例错误消息。 4. **总结区别**:一个是有效的但可能不恰当的使用,另一个是语法错误。 基于系统指令: - 使用中文回答。 - 结构清晰,一步一步解释。 - 生成相关问题。 - 添加引用标识:引用来自用户提供的引用,例如:[^1], [^2], [^3]。 在回答中,我应该自然地引用相关部分。虽然引用没有直接-I,但它们涉及CFLAGS的使用,所以我可以间接引用。 例如: - 引用[1]提到CFLAGS用于.c文件中的宏定义,但-I是关于路径的。 - 引用[2]展示了CFLAGS += -g$(DEBUG),这类似于添加选项。 - 引用[3]提到了CFLAGS += -O2,导致优化问题,但无关路径。 或许在上下文中,用户可以误写了选项,但基于问题,我应该直接回答。 最终回答结构: - 介绍:在Makefile中,CFLAGS是用于C编译器的标志,-I选项指定头文件目录。 - 解释CFLAGS += -I/:添加根目录作为包含路径。 - 解释CFLAGS += -I:语法错误,缺少路径参数。 - 提供示例代码。 - 总结区别。 - 相关问题生成。 生成相关问题: 基于主题,例如Makefile的CFLAGS使用、常见错误等。 示例相关问题: 1. 如何在Makefile中正确添加头文件搜索路径? 2. 什么是其他常见的CFLAGS选项及其作用? 3. 如何处理Makefile中的路径错误? 现在,构建回答。 </think>### Makefile中 `CFLAGS += -I/` `CFLAGS += -I` 的区别 在Makefile中,`CFLAGS` 用于设置C编译器的选项,例如添加头文件搜索路径、优化级别或宏定义。用户的问题涉及 `-I` 选项的使用,该选项是GCC编译器的标准功能,用于指定头文件的搜索目录。下面我将逐步解释两者的区别,确保回答清晰可靠。 #### 1. **`-I` 选项的作用** - `-I` 是GCC编译器的选项,用于添加额外的头文件搜索路径。例如,`-I/path/to/include` 告诉编译器在编译时搜索 `/path/to/include` 目录中的头文件。 - 在Makefile中,通常通过 `CFLAGS += -I路径` 的形式添加这些路径,确保编译器能找到自定义或第三方库的头文件。这是一种常见的做法,如引用[2]中所示:`CFLAGS += -g$(DEBUG)` 用于添加调试信息选项[^2]。 #### 2. **`CFLAGS += -I/` 的解释** - `CFLAGS += -I/` 表示添加根目录(`/`)作为头文件搜索路径。 - **含义**:这里的 `/` 是一个完整的目录路径(根目录)。编译器会在根目录下搜索头文件。 - **潜在问题**: - 根目录通常包含系统文件(如 `/usr/include`),但直接指定 `/` 可能不必要,甚至危险,因为它会暴露所有系统文件,可能导致头文件冲突或安全风险。 - 示例:如果Makefile中写 `CFLAGS += -I/`,编译时可能工作,但除非头文件确实在根目录下,否则这不是最佳实践。通常,应该指定具体子目录,如 `CFLAGS += -I/myproject/include`。 - **语法正确性**:这是一个有效的语法,但需谨慎使用。 #### 3. **`CFLAGS += -I` 的解释** - `CFLAGS += -I` 表示 `-I` 选项后缺少路径参数。 - **含义**:`-I` 选项必须后跟一个目录路径(例如 `-Ipath`)。如果省略路径,编译器将报错。 - **具体错误**:编译器会提示“missing argument to ‘-I’”或类似错误,导致编译失败。 - **原因分析**:在Makefile中,这种写法是语法错误。`-I` 是一个带参数的选项,没有路径就无法工作。例如,引用[3]中提到了 `CFLAGS += -O2` 的正确使用(添加优化选项),但错误形式的 `-I` 会中断编译过程[^3]。 #### 4. **关键区别总结** | 形式 | 语法有效性 | 作用 | 示例代码 | 潜在风险 | |------|------------|------|----------|----------| | `CFLAGS += -I/` | 有效 | 添加根目录 (`/`) 为头文件路径 | `gcc $(CFLAGS) -c main.c` | 可能导致头文件冲突或不必要系统访问 | | `CFLAGS += -I` | 无效(语法错误) | 缺少路径参数,无法工作 | 编译器报错:"error: missing argument to ‘-I’" | 编译失败,项目无法构建 | **简单总结**: - `CFLAGS += -I/` 是有效的,但它添加的是根目录路径,可能不实用。 - `CFLAGS += -I` 是无效的,因为 `-I` 后必须指定一个路径(如 `-Iinclude`)。这在Makefile中常见于笔误或配置错误。 #### 5. **示例代码** 假设一个Makefile示例: ```makefile # 添加头文件路径的正确方式 CFLAGS += -I./include # 搜索当前目录下的 include 子目录 CFLAGS += -I/usr/local/include # 搜索系统特定目录 # 错误方式:CFLAGS += -I (缺少路径) 会导致编译错误 # CFLAGS += -I # 取消注释会报错 all: program program: main.c gcc $(CFLAGS) -o program main.c ``` - 如果使用 `CFLAGS += -I/`,编译器会搜索根目录下的头文件。 - 如果使用 `CFLAGS += -I`,编译时会直接失败。 #### 6. **相关注意事项** - **路径格式**:在UNIX-like系统中,路径区分大小写和斜杠。`-I/` 指定绝对路径,而 `-Irelative/path` 指定相对路径。 - **Makefile最佳实践**:引用[1]提到,宏定义如 `EXTRA_CFLAGS += -D` 是针对源代码的,而类似 `-I` 的路径选项也直接影响编译过程[^1]。确保路径存在且正确,以避免编译问题。 - **常见错误**:如果遇到头文件未找到错误,检查 `-I` 后的路径是否拼写正确。引用[3]中优化选项导致的问题提醒我们,编译标志的错误配置可能引发运行时异常[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值