错题总结之赋值语句

题目一:比较下面两段代码的不同?

代码1:

#include <iostream>

using namespace std;

int main()
{
    int a,x;
    for(a=0,x=0;a<=1 && !x++; a++)
    {
        a++;
    }

    cout << a << x << endl;
    return 0;
}
代码2:

#include <iostream>

using namespace std;

int main()
{
    int a,x;
    for(a=0,x=0;a<=1 && !x++; )
    {
        a++;
    }

    cout << a << x << endl;
    return 0;
}
代码运行的结果是什么:代码一结果为21 ,代码二结果为12

为什么呢?大家可以清楚看到在程序中只有for循环这个地方有差别,少了一个a++,对于第一段代码来说,运行过程如下:

        第一步,初始化定义a=0,x=0;

        第二步,a<=1,x的非为1,符合循环条件

        第三步,x++后x自增为1

        第四步,进入循环体后,执行a++,a自增为1

        第五步,执行for循环中的a++,此时a自增为2

        第六步,a现在已经是2,不符合循环条件了,所以“&&”后面的“!x++”不执行,

        第七步,打印a和b的值,分别为2和1

结果如下

                                                        

第二段代码运行:

        第一步,初始化定义a=0,x=0;

        第二步,a<=1,x的非为1,符合循环条件

        第三步,x++后x自增为1

        第四步,进入循环体后,执行a++,a自增为1

        第五步,a现在已经是1,符合循环条件了,所以“&&”后面的“!x++”被执行,x现在是1,x的非为0,不符合循环条件,不执行循环体,但x++依然执行,自增为2

        第六步,打印a和b的值,分别为1和2

结果如下:

                                                                        

题目二,以下代码输出的结果是什么?

           

#include<stdio.h>
int main()
{
    int b = 3;
    int arr[] = {6,7,8,9,10};
    sint *ptr = arr;
    *(ptr++) += 123;
    printf("%d,%d\n",*ptr,*(++ptr));
    return 0;
}
          我们知道C语言中printf计算参数时是从右到左压栈的。程序中 *(ptr++) += 123;的执行过程应该为*ptr=*ptr+123;ptr++,此时ptr应该指向了数组的第二个元素7。

           但是,printf("%d,%d\n",*ptr,*(++ptr));中,是从右到左进行运算的,第一个(++ptr)也就是ptr++,于是*ptr=8,此时ptr指向了数组的第三个元素,所以两个值都为8.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值