当前位置: 首页 > 面试题库 >

C和Java中的逻辑差异

江琦
2023-03-14
问题内容

编译并在C中运行此代码

#include <stdio.h>

int main()
{
  int a[] = {10, 20, 30, 40, 50};
  int index = 2;
  int i;

  a[index++] = index = index + 2;
  for(i = 0; i <= 4; i++)
    printf("%d\n", a[i]);
}

输出: 10 20 4 40 50

现在对于Java中的相同逻辑

class Check
{

  public static void main(String[] ar)
  {
    int a[] = {10, 20, 30, 40, 50};
    int index = 2;

    a[index++] = index = index + 2;
    for(int i = 0; i <= 4; i++)
      System.out.println(a[i]);
  }
}

输出: 10 20 5 40 50

为什么两种语言的输出都不同,输出是可以理解的,Java但我无法理解C

还有一件事,如果应用前缀++运算符,那么两种语言的结果相同,为什么呢?


问题答案:

这是因为a[index++] = index = index + 2;在C.看看所调用未定义行为这

从链接:

第二句说:如果将对象写入完整表达式中,则在同一表达式中对对象的任何和所有访问都必须直接参与要写入的值的计算。该规则有效地将法律表达形式限制为在修改之前先进行访问的行为。例如,允许使用旧备用i
= i + 1,因为对i的访问用于确定i的最终值。这个例子

 a[i] = i++

之所以被禁止,是因为i的访问之一( a [i] 中的访问 )与最终存储在i中的值(在i
++中发生)无关,因此,没有很好的方法来定义-无论是出于我们的理解还是编译器的理解-访问是应该在存储增量值之前还是之后进行

。由于没有定义它的好方法,因此标准声明它是未定义的,并且可移植程序绝对不能使用此类构造。与a[i++]=i(调用UB)类似,您的表达式也调用UB。

您的表情也有类似的行为。

该行为在中已定义好Java



 类似资料:
  • 问题内容: 我们需要使用Java进行逻辑回归。我们在Python http://blog.smellthedata.com/2009/06/python- logistic-regression- with-l2.html中 使用了此代码,并且基本上希望在Java中使用相同的代码。我被定向到Weka,但许可是非商业性的。 我发现Omegahat API具有像Scipy这样的BFGS最小化器,但我无

  • 我已经有一段时间没有编程了,我正在努力回到事情的转折点,这就是我已经走了多远。我的问题是,我如何循环第二个问题,这样,如果回答不是肯定的,它会再次问这个问题。我曾尝试在if语句周围放置一个循环,但每当我尝试从用户那里获得另一个响应时,它告诉我无法使用变量response来执行此操作。我觉得这是一个简单的修复,因为我理解循环,但我有一个困难的时候围绕着这个具体的问题我的头,提前谢谢你。

  • 我正在从书本上学习java,我遇到了一个逻辑问题,我知道代码没有它可能的那么有效,但我想了解这个问题,这样我就可以更好地了解Java是如何工作的,并避免将来出现更复杂的问题。 我正在尝试编写的程序应该读取账户余额和利率,然后在一年和两年后给出余额。 第二年的利率应按第一年起的总额计算。 但我的计划只是在第一年到第二年增加相同数额的利息。如果余额是6000,利息是4.25,我第一年得到6255.0,

  • 问题内容: 运算符和有什么不一样?和运算符|| ?? 而且&和&& ??有什么区别? 谢谢… 问题答案: 主要区别在于,在表达式中,如果为false,则不会进行计算,而在两者中,无论如何都将进行计算。可以说是“ 短路 ”评估。 同样,对于:如果为true,则不会进行评估,而对于两者而言,则无论如何都将被评估。

  • 我试图理解JVM的内存管理方案 考虑A、B两类 从主B B=新B(); 据我所知,类加载器将加载A、B,并分别创建2个对象。是否有任何其他对象将被创建? 另外,我问题的第二部分是,在访问Java Visual VM时,我看到Java NIO包的对象已经创建。有什么方法可以阻止JVM创建与我的项目无关的对象吗?

  • 在之前的 C 语言标准中,逻辑运算符是表示两个数值之间逻辑关系的运算符。通常用 0 和 1 来表示假值和真值。但是在 C 语言中会认为非 0 的数值在逻辑运算中都为 1 。逻辑运算的返回值也是整数型,不是 0 就是 1 ,这点和其他很多编程语言是不同的。 但是,在 C99 标准中引入了布尔类型。所以 C 语言中的逻辑运算就简单了很多。要想使用布尔类型,需要引入 stdbool.h 这个库即可。但是