zoukankan      html  css  js  c++  java
  • C++笔记015:C++对C的扩展——三目运算符功能增强

     


     原创笔记,转载请注明出处!

     点击【关注】,关注也是一种美德~


     

    三目运算符在C编译器中的表现:

    int main()

    {

    int a=10;

    int b=20;

    //三目运算符是一个表达式,表达式不能做左值

    (a<b?a:b)=30;

     

    printf("a=%d,b=%d",a,b);

    return 0;

    }

     

    运行程序我们发现编译失败!

    看原因我们看到是表达式不能做左值

    这句话怎么理解呢?

    C语言中,表达式的返回值是一个数,表达式的运算结果放在了CPU的寄存器里面,而不是内存中,不是一个内存地址(后面查笔记有关C和C++的左值、右值)。

    也就是说在C语言中,a=10,b=20,执行a<b?a:b 语句,就是【10<20 吗?是的!好!那就返回a的值吧!】就把数字“10”返回了,接着就是 10=30,将30赋值给10?这是怎么个意思,就出错了!

    在C++中,表达式返回的是变量的本身,也就是返回的变量a。

    在C++中编译同样的代码:

    #include<iostream>

    using namespace std;

     

    int main()

    {

    int a=10;

    int b=20;

    //三目运算符是一个表达式,表达式不能做左值

    (a<b?a:b)=30;

     

    printf("a=%d,b=%d",a,b);

     

    system("pause");

    return 0;

    }

    运行结果:

    a=30,b=20

    请按任意键继续...

     

    那么在C语言中如何实现同样的效果呢?

    我们想一下,如果想表达式能当左值,就是说三目表达式应该返回一个内存空间!也就是内存的首地址!内存的首地址是什么呢?就是指针吧。

    a<b ? a:b 这个表达式就算完毕之后,我不想让它返回a的值10,如果我能返回a的地址,然后再给这个地址赋值那就可以了。

    我可以这么写:(a < b ? &a : &b) = 30,通过这个地址就可以间接修改指针指向的内存空间,也就间接修改了a的值,注意在括号前面再加上星号“ * ”就是修改对应的值了。我们修改后再运行发现跟C++运行是一样的。

    int main()

    {

    int a=10;

    int b=20;

    //三目运算符是一个表达式,表达式不能做左值

    *(a<b?&a:&b)=30;

     

    printf("a=%d,b=%d",a,b);

    return 0;

    }

    运行结果:

    a=30,b=20

    Press any key to continue

     

    所以,C++编译器是帮我们程序员完成了取地址的工作。

    结论

    1、 C语言返回变量的值,C++语言返回变量本身;

    C语言中的三目运算符返回的是变量值,不能作为左值使用;

    C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方。

    2、注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用,如

    (a < b ? 1 : b)= 30;

    3、C语言如何支持类似C++的特性呢?

    当左值的条件:要有内存空间,C++编译器帮助程序员取了一个地址而已。

     


     原创笔记,转载请注明出处!

     更多精彩请关注微信公众号:依法编程


     

     

  • 相关阅读:
    使用virtualenv搭建python3的环境
    Linux/unix inode
    转:进程间通信方式
    保研复试上机——数据库
    转:mysql grant
    mysql 查询结果创建表
    279. Perfect Squares
    Mybatis中javaType和jdbcType对应和CRUD例子
    mysql explain
    91. Decode Ways
  • 原文地址:https://www.cnblogs.com/tyyhmtyyhm/p/8973927.html
Copyright © 2011-2022 走看看