i++问题探索

本文探讨了不同编译器,如GCC和MSVC下,i++运算符在处理字符串和整数类型时的行为差异。在Ubuntu 18.04的GCC 7.5.0中,无论对string还是int类型,i++运算符似乎总是在赋值前增加索引,而在Windows 10的MSVC中,对于string类型,i++运算符的行为则相反。文章通过代码示例和反汇编分析解释了这种现象,并提出了将i++操作分解为两步以确保一致性的建议。
摘要由CSDN通过智能技术生成

不同编译器下的i++不尽相同。

代码

#include<iostream>
using namespace std;
int main(){
    string s = "hello";
    char str[20] = { 0 };
    int i = 0;
    str[i] = s[i++];
    //str[i++] = s[i];
    cout << "0 \t" << str[0] << endl;
    cout << "1\t" << str[1] << endl;
    
    int a[3] = { 3, 4, 5 };
    int b[2] = { 0, 0 };
    i = 0;
    b[i] = a[i++];
    //b[i++] = a[i];
    cout << "0 \t" << b[0] << endl;
    cout << "1\t" << b[1] << endl;
}

Ubuntu 18.04下

编译器版本:gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)

在gcc编译器下,无论是string类型还是int类型,无论是“str[i] = s[i++];“,“b[i] = a[i++];”执行结果都是b[0] = a[1],或str[0] = str[1]。即会在b[i] = a[i]之前执行i++。
而”str[i++] = str[i]”,“b[i++] = a[i];”执行结果都是b[0] = a[0],或str[0] = str[0]。即会在b[i] = a[i]之后执行i++。

执行结果:
str[i] = s[i++];
b[i] = a[i++];
在这里插入图片描述
执行结果:
str[i++] = str[i];
b[i++] = a[i];
在这里插入图片描述

Windows10下

编译器版本:MSVC Version: 1929

在MSVC编译器下,对于string类型,“str[i] = s[i++];“执行结果是str[0] = str[1]。即会在str[i] = str[i]之前执行i++。“str[i++] = str[i];”执行结果是str[0] = str[0]。即会在b[i] = a[i]之后执行i++。
而int类型无论是“b[i] = a[i++];”还是“b[i++] = a[i];”执行结果都是b[0] = a[0]。即会在b[i] = a[i]之后执行i++。

执行结果:
str[i] = s[i++];
b[i] = a[i++];
在这里插入图片描述
执行结果:
str[i++] = s[i];
b[i++] = a[i];
在这里插入图片描述

MSVC下的反汇编代码

在这里插入图片描述
可以看到在没有执行赋值操作之前就把i的值进行了加一的操作(add ecx,1)
在这里插入图片描述可以看到在执行了赋值操作之后才把i的值加一(add eax,1)

建议

b[i++] = a[i]分开写:b[i] = a[i]; ++i;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值