c语言且符合,c语言且符号
dfnjsfkhak
31
大家好,今天小编关注到一个比较有意思的话题,就是关于c语言且符合的问题,于是小编就整理了2个相关介绍c语言且符合的解答,让我们一起看看吧。
- c语言中且用什么符号?
- C语言执行a=a++; 后,a的值应该加一还是不变?
分别是&&和||。
c语言中的&&有三种使用方式。
1 、取地址操作符。
单目运算,与其后的变量或常量组合,用于获取该操作数的内存地址。
2 、位操作中的按位与操作
双目运算符,&&的两边的表达式均参与操作。计算时按位计算。对于任意一位,如果两个操作数该位上的值均为1,则结果该位上为1。否则结果该位上值为0。
3 、当两个&&符号同时使用,即&&符号。
它的意思是代表逻辑运算中的逻辑与。双目运算符,&&的两边的表达式均参与操作。
(图片来源网络,侵删)
C语言执行a=a++; 后,a的值应该加一还是不变?
这个不能从C语言的语法角度出发考虑,只能从底层设计考虑。不同的编译器应该会得到不同的结果,具体要看设计编译器的程序员怎么做。正常来说a++是先取出a来用,然后自增a。对于操作系统来说,首先要取得标识符a在符号表里记录的存储地址,然后取出这个数,后面得处理细节就会决定a到底是22还是23。理论上a=a++,从内存里取得a的地址以后再把该值放到内部寄存器里,然后写回a地址处的内存里,这时候记录a值的寄存器做自增操作,再写回原地址的内存区,就会使得a为23(也可能不是这样的做法,具体得看编译器设计人员);若要得到22,则我猜编译器设计的时候应该是先取得a地址内存内的数,然后放入寄存器R1记录,而随后做自增操作,先取出a地址处的值,然后放入寄存器R2,R2自增,写回到原地址。然后进行赋值操作,R1回填,覆盖修改结果。这样设计编译处理过程则得到22(实际情况也可能是其他情况,我这里只是给了两种编译器在中间代码生成上的不同做法。不用的人来做会有不同结果)。说的再明白点就是,对于a=b++(b可以就是a),如果底层的做法是拿一个寄存器R1做过度,则为23;如果是两个寄存器R1,R2过度,R1,R2均记录b的值一个负责回填a一个负责自增回填且自增回填在先,则有可能导致22。像这样的编程风格,不太建议。
首先必须指出来,在C语言中这种a=a++这种写法是完全不规范的或者错误的写法。
而且我猜你的编译器在编译的时候已经报了警告的错误,但是没有报错,最后也是给出了22这个答案。
如果你真的想知道为什么是22这个答案,我们就要查看这句代码编译后的汇编代码,而这个代码比较晦涩,有点反人类,建议就不用去看了!
总之,记住不要这么用就对了,因为编译器压根就不知道你想干嘛!
再补充一点,你可以试试用不同的编译器,编译出来的结果都不同,有的编译出来是22,有的编译出来是23,所以说,最后再提醒一次,不要用这种不规范的写法!
看了前面的很多回答,都没有回答到点子上,这个问题其实是典型的关于C语言中的序列点和副作用产生的问题。
大部分的语句是不带副作用的,而问题中的语句是一个的带副作用的语句,就是在取a的值进行赋值的同时,又修改a的值对其进行自增1,其自增1就是语句中的副作用。
序列点是C标准中给出的概念,简单的理解就是程序执行的点,在这个点之前的语句的执行结果都将生效,而这个点之后的语句还未开始执行,常见的序列点有语句末尾的;号、逻辑运算符、逗号运算符、条件表达式。
C语言标准规定:两个序列点之间的执行顺序是任意的。 当然这个任意是在不违背操作符优先级和结合特性的前提下的。 这个规定的意义是为编译器的优化留下空间。
问题中的表达式 a=a++ 处于两个序列点之间的,编译器可以先算完a++,完成a自增再写结果给a,也可以先将a=a,再令a自增。无论哪种执行对于C语言标准来说都是符合标准的,具体还是要看编译器选择哪一种实现。
在实际开发中我会建议不要在一个序列点之间对一个变量多次进行赋值写入操作,因为这些操作的结果都属于未定义的行为,都是要看编译器具体实现的,使程序不具备可移植性,而变成了依赖于某个编译器的实现。
而这个问题可以称他为未定义的实现,就是C语言标准没有给出标准结果,交由编译器负责具体实现,而无论如何实现其实对于C语言标准来说都是对的。
到此,以上就是小编对于c语言且符合的问题就介绍到这了,希望介绍关于c语言且符合的2点解答对大家有用。
标签: 编译器
语言
寄存器
版权声明:本文来源于网络,不代表本站立场,如转载内容涉及版权等问题,请联系邮箱:83115484@qq.com,我们会予以删除相关文章,保证您的权利。