//区别⑦:三目运算符(C++版本)
#include<iostream>
using namespace std; //三目运算符 C语言返回变量的值 C++语言是返回变量本身 void main(){
int a = ;
int b = ;
a < b ? a : b = ;
//C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
//注意:
//三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
//(a < b ? 1 : b) = 30;
system("pause");
}
//区别⑦:三目运算符(C语言版本)
#include<stdio.h>
#include<stdlib.h>
#include<string.h> void main(){
int a = ;
int b = ;
//a < b ? a : b = 30; 报错 error C2106: “=”: 左操作数必须为左值
//详解: 在C语言中,a < b ? a : b这里返回的a是a的值,而不是a这个变量
//常量是不可以做左值的
//左值在c++中很重要,元素当左值的条件是这个元素必须存在内存空间(在寄存器中的值就没有内存空间) //在C语言中实现三目运算符返回变量
*(a < b ? &a : &b) = 30;
system("pause");
}
//区别⑧:const修饰符(C++版本)
#include<iostream> using namespace std; //Const优点(C语言 c++共有优点)
//合理的利用const,
//1指针做函数参数,可以有效的提高代码可读性,减少bug;
//2清楚的分清参数的输入和输出特性
//例子:
//int setTeacher_err( const Teacher *p)
//Const修改形参的时候,在利用形参不能修改指针所向的内存空间 struct Teacher{
char myname[];
int age;
}; void PrintfA(Teacher const *pin/*in*/){
//pin->age = 30;
//报错 error C3490: 由于正在通过常量对象访问“age”,因此无法对其进行修改
pin = (Teacher *)0x1;
} void PrintfB(Teacher * const pin/*in*/){
//pin = (Teacher *)0x1;
//报错 error C3892: “pin”: 不能给常量赋值
pin->age = ;
} void PrintfC(Teacher * const * pin/*in*/){
//pin->age = 30;
//报错 error C2227: “->age”的左边必须指向类/结构/联合/泛型类型
//pin = (Teacher *)0x1;
//报错 error C2440: “=”: 无法从“Teacher *”转换为“Teacher *const *”
} void fun1(){
#define N2 10
const int bb = ;
printf("变量的值是:%d\n", bb);
} void fun2(){
printf("变量的值是:%d\n", N2);
//printf("变量的值是:%d\n", bb); error C2065 : “bb” : 未声明的标识符
//表明 #define宏定义与 const 修饰变量的作用域不同 //关闭宏定义
#undef N2
//#undef 后面不加参数 直接关闭所有的宏定义
/*printf("变量的值是:%d\n", N2); error C2065 : “N2” : 未声明的标识符*/
} void main(){
//const int a;
// error C2734: “a”: 如果不是外部的,则必须初始化常量对象
const int a=;
int const b = ; //C++语言的间接赋值(这与C语言不同)
int *p1 = (int *)&a;
*p1 = ;
printf("a=%d\n", a);// 打印a=10
printf("*p1=%d\n", *p1);// 打印*p1=11
printf("&a=%x\n", &a);//打印 &a= d2f7e0
printf("p1=%x\n", p1);// 打印 p1= d2f7e0 //详解 const int a=10;
//在c++中,存在一个符号表,以键值对的形式存储 const 修饰的变量 和 变量的值,
//当c++编译器编译到 const int a=10; 这句话的时候
//c++编译器会在符号表创建一个键值对 key 是 变量 a, value 是 10;
//当后面程序使用到 const修饰的 a变量 的时候 c++编译器会直接从 符号表里取 a的值
//当c++编译器 检索代码时 发现存在 &a(对 const 修饰的 a 取地址 )的操作的时候
//c++会隐式 为 &a 分配一个内存空间 并且将 10 存入到这个内存空间
//当程序员 *p1 = 11; 修改 *(&a) 的值的时候 修改的是个隐式创建的内存空间里的值
//不会修改符号表中 a的数据
//c++编译器之所以这么设计 是因为 C语言支持 对const 修饰的变量 取地址 为了兼容C语言 才如此设计的
/*注意:C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值(即任何时候获取a的值都是10)。*/ char arr[a] = { };//C语言中 const 常量不可以定义数组
char temparr[a+b] = { }; #define N 10
char arr2[N] = { }; //C++中的const常量类似于宏定义
//const int c = 5; ≈ #define c 5
//C++中的const常量在与宏定义不同
//const常量是由编译器处理的,提供类型检查和作用域检查
//宏定义由预处理器处理,单纯的文本替换 system("pause");
}
//区别⑧:const修饰符(C版本)
#include<stdio.h>
#include<stdlib.h>
#include<string.h> typedef struct _teacher{
char myname[];
int age;
}Teacher; void PrintfA(Teacher const *pin/*in*/){
//pin->age = 30;
//报错 error C2166: 左值指定 const 对象
pin = (Teacher *)0x1;
} void PrintfB(Teacher * const pin/*in*/){
//pin = (Teacher *)0x1;
//报错 error C2166: 左值指定 const 对象
} void PrintfC(Teacher * const * pin/*in*/){
//pin->age = 30;
//报错 error C2227: “->age”的左边必须指向类/结构/联合/泛型类型
pin = (Teacher *)0x1;
//警告 warning C4047: “=”:“Teacher *const *”与“Teacher *”的间接级别不同(这样C++不同)
} void main(){
const int a=;
//a = 1;// error C2166: 左值指定 const 对象 //C语言的间接赋值
int *p1 = &a;
*p1 = ;
printf("a=%d\n", a);//打印 a=11 //int buf[a] = { 0 };
//报错 error C2057: 应输入常量表达式 //以上例子说明 在C语言中 const只是个伪常量 const变量是只读变量,有自己的存储空间 system("pause");
}

C++ c++与C语言的区别(三目运算符,const修饰符)的更多相关文章

  1. [Reprint]C++函数前和函数后加const修饰符区别

    c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...

  2. C++函数前和函数后加const修饰符区别

    class Test(){ public: Test(){} const int foo(int a); const int foo(int a) const; }; 一.概念 当const在函数名前 ...

  3. Java语言中有4种访问修饰符

    转载:http://wuhaidong.iteye.com/blog/851754 Java语言中有4种访问修饰符 在Java语言中有4中访问修饰符:package(默认).private.publi ...

  4. 理解C语言中几个常见修饰符

    写在前面 今天下午一个同事问「register」关键字是什么作用?噢,你说的是「register」啊,它的作用是……脑袋突然断片儿,我擦,啥意思来着,这么熟悉的陌生感.做C语言开发时间也不短了,不过好 ...

  5. Java语言中的访问权限修饰符

    一个Java应用有很多类,但是有些类,并不希望被其他类使用.每个类中都有数据成员和方法成员,但是并不是每个数据和方法,都允许在其他类中调用.如何能做到访问控制呢?就需要使用访问权限修饰符. Java语 ...

  6. C#中ref和out关键字的应用以及区别(参数修饰符)

    ref ref的定义 ref是reference的缩写,通过引用来传递参数的地址,ref基本上是服务于值类型的 ref的使用 //不使用 ref; void Method(int myRefInt) ...

  7. C++ 成员函数前和函数后加const修饰符区别

    博客转载自: https://www.iteblog.com/archives/214.html 分析以下一段程序,阐述成员函数后缀const 和 成员函数前const 的作用 #include< ...

  8. 吴裕雄--天生自然C++语言学习笔记:C++ 修饰符类型

    C++ 允许在 char.int 和 double 数据类型前放置修饰符.修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求. 下面列出了数据类型修饰符: signed unsigned lo ...

  9. 不可或缺 Windows Native (11) - C++: hello c++, C++ 与 C语言的区别小介

    [源码下载] 不可或缺 Windows Native (11) - C++: hello c++, C++ 与 C语言的区别小介 作者:webabcd 介绍不可或缺 Windows Native 之 ...

随机推荐

  1. 外媒关注:中国版Twitter新浪微博推出微米对抗微信

    Sina, China’s answer to Twitter, enters the mobile messaging battle with its own app 中国版Twitter新浪,用自 ...

  2. 全栈project师体能备战--知识面(10--20)

    WCF Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,能够翻译为Windows 通讯开发平台. 对于 WCF 的client ...

  3. UIScrollView 循环滚动,代码超简单

    如今非常多应用里面多多少少都用到了循环滚动,要么是图片.要么是view,或者是其它,我总结一下,写了个demo分享给大家. 先看代码之后在讲原理: 1.创建一个空的项目(这个我就不多说了). 2.加入 ...

  4. this详解与面向对象编程

      原文链接:http://www.cnblogs.com/kongxy/p/4581223.html JS中的this对象详解 声明:文章转载自上面地址,版权归阿孔所有,这里仅供本人学习笔记使用 t ...

  5. JDBC 利用反射技术将查询结果封装为对象(简单ORM实现)

    ORM(Object Relational Mapping)对象关系映射 public class ORMTest { public static void main(String[] args) t ...

  6. 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件

    PhotoRec – Recover Deleted or Lost Files in Linux 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件 当你在系统中有意或无意地 ...

  7. Makefile之写demo时的通用Makefile写法

    Makefile之写demo时的通用Makefile写法[日期:2013-05-22] 来源:CSDN  作者:gqb666 [字体:大 中 小] 前面的一篇文章Makefile之大型工程项目子目录M ...

  8. SQLServer 2008中SQL增强之三 Merge(在一条语句中使用

    SQLServer 2008中SQL增强之三 Merge(在一条语句中使用Insert,Update,Delete)   SQL Server 2008提供了一个增强的SQL命令Merge,用法参看M ...

  9. web项目的路径问题

    一.使用base标签,使相对路径和绝对路径可以同时使用 但是,base标签对Ie低版本不兼容(IE8及IE8以下) 不过,鉴于IE在国内具有无与伦比的统治地位,所以,换了个写法: <script ...

  10. jquery操作复选框(checkbox)十二技巧

    jquery操作复选框(checkbox)的12个小技巧. 1.获取单个checkbox选中项(三种写法)$("input:checkbox:checked").val()或者$( ...