c++ - 将前增量和后增量放在像这样 (++i)++ 这样的单个变量上时,它在 c++ 中有效,但在 c 中无效
问题描述
我用值 3 初始化了一个变量 i,然后在我的代码中添加了一个语句 (++i)++。但是,在 C 中,它显示错误“需要作为增量操作数的左值”。但是,如果我将这个类似的代码放在 c++ 中,它可以工作并显示输出 5 的双倍增量。但是,我的一个朋友使用 c 尝试了他的编译器,它给出了输出 4。
//using c
#include <stdio.h>
int main()
{
int i=3;
(++i)++;
printf("%d",i);
return 0;
}
//using c++
#include <bits/stdc++.h>
using namespace std;
int main()
{
int i=3;
(++i)++;
cout << i << endl;
return 0;
}
我正在使用 GNU GCC 编译器。
解决方案
众所周知,这是未定义的行为。从语法上讲,这个程序在 C++ 中是正确的,编译器会生成一些二进制代码……但标准允许它生成任何代码,甚至是返回 100 或格式化磁盘的代码。在实际情况下你可能会观察到非常奇怪的异常情况,例如编译器可以在你的(++i)++
语句之后丢弃整个代码,因为标准允许它在程序进入 UB 状态后立即为所欲为。在您的情况下,这意味着根本没有输出(或者程序将打印“Hello World”而不是整数值)。
我相信你只是在做一个实验。结果是:您的编译器和您朋友的编译器都是正确的。
推荐阅读
- ajax - 如何修复“500 内部服务器错误”以响应 ajax 调用
- google-sheets - 如何将矩形单元格转换为 Google 表格中的一行/列单元格?
- javascript - 如何添加指向 API 结果的链接
- unit-testing - 如何编写测试以确保编译错误?
- kotlin - 为什么这个表达式被认为是不可变的,因此可以使用 `val` 来定义?
- r - 使用 dplyr 查找具有最短日期的列的名称
- gmail-api - service.users().messages().get() 错误:java.io.EOFException:SSL 对等体错误关闭
- database - 如何解析 Redis AOF 文件?
- mysql - 将几个替代表表示为一个表?
- python - 如何在具有多行字符串的文件中搜索多个字符串