为什么在不同编程软件中,得到的结果不同啊?

img

为什么这个程序在不同编译器中运行结果不同啊?在cfree中得到的是12,Dev-C++中得到的是10?12是怎么计算得到的呢?恳请大家指导一下!

只能说不同编译器, ++ 和 -- 的先后执行顺序 不一样的,结果也是不一样。

这是C语言的未定义行为,未定义行为的代码,不同编译器结果不同
https://blog.csdn.net/houzijushi/article/details/102754339

这个确实不同编译器可能会有不同结果。对于连续的++x + ++x这种,结果不一样

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/696894
  • 这篇博客也不错, 你可以看下求求大家指点指点我吧——大一C语言题:编写一段程序,计算某个日期为这一年的第几天及第几周的星期几。(使用软件Dev-C++)如下是我代码,感觉还挺对,至少编译时没错误没警告,但是运行时出不来结果啊啊啊
  • 除此之外, 这篇博客: 【C++基础】第6章:函数中的 3.1 函数重载:使用相同的函数名定义多个函数,每个函数具有不同的参数列表 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在这里插入图片描述
    在这里插入图片描述
    3.5被取整为3了:
    在这里插入图片描述
    我们可能需要这么定义:才能返回4.5
    在这里插入图片描述
    但上面代码麻烦。所以引入函数重载:
    在这里插入图片描述
    即基于不同参数类型进行重载(上图3行的int x和8行的double x)。

    但下图不是函数重载:(具有相同的函数名、参数列表)
    在这里插入图片描述
    注意:

    1. 不能基于不同的返回类型进行重载(下图两个fun函数只在返回类型上有差异)
      在这里插入图片描述
      因为如果像下图这样调用fun函数,系统就不知道调用哪个fun函数了:
      在这里插入图片描述
    2. 函数重载与name mangling
      如下图,我们定义了两个函数,这两个函数定义在main.cpp里面,在编译这个翻译单元时,系统会首先将main.cpp编译成相应的二进制文件,接下来会把main.cpp和其他.cpp文件编译的二进制文件进行链接来生成程序。那么我们在编译这样的二进制文件时,编译完之后,mian.cpp里面有两个fun函数。若其他.cpp文件(如source.cpp)想调用fun函数(只需要声明fun函数,不需要重新定义fun函数),相应地,编译器进行链接时,会认为source.cpp文件既然调用fun函数,那么就可以链接到mian.cpp相应的函数定义里面。
      在这里插入图片描述
      但有个问题,mian.cpp编译成二进制文件之后,source.cpp要链接fun函数,那么得找到正确的fun函数去链接,而上图有两个fun函数,到底是链接哪个fun函数,这需要在编译出来的二进制文件中给出相应的信息,
      在这里插入图片描述
      在这里插入图片描述
      由上图知,在编译成二进制文件之后,二进制文件里面除了包含fun名称之外,还必须包含double、int这些信息。因为只有包含这些信息,接下来和source.cpp文件链接时,source.cpp文件里面调用的fun(double),系统就知道要选择main.cpp中的fun(double x)和source.cpp文件链接。调用fun(int)同理。

    但以上操作对计算机不友好,所以c++还会做name mangling的操作:即把下图上半部分这些名称表示为下半部分的形式:(编译器内部会维护一个映射,即如何把原始名称变成mangling之后的名称)
    在这里插入图片描述
    demangling:
    在这里插入图片描述
    正是c++支持重载,因此我们必须使用mangling,即我们不能简简单单地通过函数名称来确定函数的信息,我们还需要参数信息。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^