c语言在线编译器 c语言在线编译器菜鸟工具
2025-03-22 06:39 - 立有生活网
今天欣欣来给大家分享一些关于c语言在线编译器菜鸟工具方面的知识吧,希望大家会喜欢哦
c语言在线编译器 c语言在线编译器菜鸟工具
c语言在线编译器 c语言在线编译器菜鸟工具
1、return 0;这个表达式的求值顺序为从右到左:char ch;首先计算a/a的值为1,然后计算下一部分赋值语句,也就是a+=1,a的值变成5+1也就是6;下一步是a=6,a自乘一次变成36;接下来计算a-=36,于是a=a-36,结果为0。
2、测试如图,环境为Windows XP SP3 + MinGW(gcc4.3),以及ubuntu9.04(Linux 2.6)gcc4.3实际上如图所示,gcc在-Wall开关下会提示a的这种赋值可能是未定义的行为,因而可能不同的编译器实现会有不同的结果。
3、也就是说,尽管ANSI C99标准中规定了表达式求值的顺序是从右到左,但是并没有规定在一个表达式中一个变量出现多次时,这个变量的值在计算过程中是不是会变。
4、上面给出的gcc的实现方式是对a随时求值并赋值,然而另一个编译器可能会这样做:(首先咱们通俗的说一下^_^)我们记住了a的值是5,然后开始从右到左计算:a/a值是1;接下来计算a+=1,根据我们的记忆,a的值是5,于是这部分的值就是6;同样,计算a=6时,根据我们的记忆,a的值是5,所以结果变成30;然后a-=30,便计算出5-30也就是-25的结果。
5、这一种理解方式可能跟我们看到的表达式不同,毕竟我们见到的表达式中是随时赋值,而编译器理解成a-=(a(a+(a/a)))并不是我们想说的计算,——正因为这个原因,大部分编译器实现时都采用的是种理解方式,也就是说,尽管C99中没有明确规定,但是大家已经比较统一的采用了种也是比较自然的理解方式来编译这段代码。
6、存在第二种理解方式的原因在于,我们的变量是在内存中的,然而参与计算时大部分数据位于CPU的寄存器中。
7、因而,如果我以这样一种方式去实现运算和优化,即将我们认为经常用到的数据存储在寄存器中,以便提高速度,就会变成这种情况。
8、可能的运行过程如下:编译器发现a在语句中多次出现,于是将a的值直接mov到某个寄存器中,比如EBX,然后开始计算:a/a也就是EBX/EBX(甚至这句没有而直接就是1),将结果1放在EAX中,然后下一步把EBX加到EAX上,就是那个a+=什么什么,然后再把EBX乘到EAX上,结果仍在EAX,EBX-EAX赋值给EAX,再将EAX mov到变量a,就得到了-25这样的结果。
9、当然,上面仅仅是通过分析得到的可能的运行过程,鉴于大部分编译器都不是这样实现的,而且我这里只有gcc环境,没有办法进行测试,因而我们只能说可能存在,但没有实例。
10、另外需要提醒楼主,所有牵扯到“未定义”(Undefined)行为的语句都是应该在编程中避免的,因为这些语句将依赖于您特定的编译环境。
11、像上面的语句,如果我想要说明白,并且避免未定义行为,就将该拆开的赋值拆开成多个语句,写成这样:int a=5;a=a;a-=a;也就是尽量保持语句的简单,一个语句中最多一个赋值。
12、 (原则)呵呵,没想到我速度不够快,楼主又增加了几个题目。
13、看到这些我才想起来,这应该是某些测试题上面的东西了吧?很多测试题甚至包括二级考试的题目都会考察一些与编译器实现和特定环境相关的问题,而如果你不是要学习编译原理这种课程,那么这样的考察是没有任何意义的。
14、很多这样的练习题都是,不会对个人的编程能力有任何提升,反倒使得大家经常钻入“未定义”的陷阱出不来。
15、个人观点是,如果想学好编程,自己动手实践是的途径。
16、很多东西可以通过实践去学习,比如您编程发现i++没问题但是1++会报错,于是您就知道了哦原来自增运算只能施加于左值(l-value)……当然一些基础的内容还是必要的。
17、实际上后面这几个题目都很基础,这样的问题应该在学习C语言的前期就能够自己解答的。
18、废话说的不少,本来我看到个题目后只是想说明“未定义”行为的一些东西,所以就稀里哗啦写了这么多。
19、但现在看看您下面的问题我觉得您可能只是想要而已,——于是我就顺便把其他题目也答了吧,虽然我的建议是您自己去发现,通过教材、实践。
20、个:未定义行为,大多数情况下会是0,具体原因前面说的比较清楚了。
21、好的言归正传,题目要求“值”所占的字节数,语句就是sizeof(a+4.5),然后您可以通过printf将这个结果输出,当然这个结果在大多数32位编译器上应该是8,因为a是整数,但是4.5是双精度浮点数,运算将默认对整数进行类型转换,变成同样的double型后和4.5进行运算。
22、得到的结果当然也是double型,——而几乎所有32位编译器实现中,double型占8个字节。
23、这里不得不提到的是C99标准的一个可能会造成众多C程序员疑惑的地方,就是浮点数在程序中默认是双精度的,除非强加f标志表示float型。
24、于是,我们可以测试,如果在前面的语句中将4.5这个数字后面加上f标志成为4.5f,那么结果可能是不一样的。
25、事实上,大部分编译器将float规定为4字节,这样经过类型提升后,4字节的int变成4字节的float,和4字节的float运算,得到的仍然是4字节的float,于是就会得到结果为4。
26、第四题:关于自增和自减,我们从这个运算符的名字就能够看出,它们是针对一个东西的,而且这个东西要可以改变才行。
本文到这结束,希望上面文章对大家有所帮助。
微信找回历史聊天记录的详细指南

微信是一款广泛使用的社交应用,我们经常在其中进行重要的对话和分享宝贵的记忆。但有时,由于误作或其他原因,我们的聊天记录可能会丢失。别担心,可以通过以下步骤找回它们: 微信找回···
初中女生的逼 初中女孩的迷惑行为

大家好,今日小篇来为大家解答以上的问题。初中女生的逼,初中女孩的迷惑行为很多人还不知道,现在让我们一起来看看吧! 初中女生的逼 初中女孩的迷惑行为 初中女生的逼 初中女孩的迷惑行···
挖鼻孔的危害 挖鼻孔的危害视频

今天小源来给大家分享一些关于挖鼻孔的危害视频方面的知识吧,希望大家会喜欢哦 挖鼻孔的危害 挖鼻孔的危害视频 挖鼻孔的危害 挖鼻孔的危害视频 挖鼻孔的危害 挖鼻孔的危害视频 1、挖鼻孔可···