标签: expression-evaluation

为什么不同的C++编译器会为此代码提供不同的结果?

我正在编写一些C++代码,用于娱乐和练习,以了解有关语言功能的更多信息.我想更多地了解静态变量及其在递归函数中的行为.在g ++编译器中尝试此代码,我得到了预期的结果:

#include <iostream>
using namespace std;

int f(const int& value)
{
   static int result = 0;
   return result += value;
}

int main()
{
   cout << f(10) << ", " << f(f(10)) << ", " << f(f(f(10)));
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

但我的朋友在Microsoft Visual C++ 6中测试了相同的代码.输出是50, 80, 90我用其他C++编译器(g ++,Borland,Code :: blocks和MingW在Linux,Win和Mac下)输出测试的110, 100, 40.我无法理解输出如何50, 80, 90......

为什么MSVC的输出不同?

c++ expression-evaluation visual-c++ unspecified-behavior

1
推荐指数
1
解决办法
2778
查看次数

如何在Haskell REPL环境中使"1 2 3"成为有效的表达式?

几年前,我遇到了haskell.org并且使用了它的REPL.我试过的其中一个表达式只是一个数字序列,用空格分隔,就像1 2 3我一样惊讶,因为它没有产生错误,但是被评估并返回了一些Haskell类型的描述,对于C和JAVA程序员来说,这似乎非常有趣.它可能只是一个细微差别,但结果确实让我感到好奇,因为一组孤立的参数似乎本身就是一个价值.

有一个表达式的例子可以尝试:foldr (:) [] [1, 2, 3].我只是尝试了(:),它仍然是一个有效的表达式并返回某种结构.

现在,同一网站的REPL无法识别这两个表达式.我也从这里下载并安装了Haskell平台,并且GHCi REPL也不认识它.我试过这个:

:set -XFlexibleContexts
Run Code Online (Sandbox Code Playgroud)

:set -XAllowAmbiguousTypes
Run Code Online (Sandbox Code Playgroud)

正如REPL消息所暗示的那样,但它不起作用.

我知道这可能不是一个有用的行为,但我仍然希望重现它.

先感谢您.

haskell types expression-evaluation read-eval-print-loop

1
推荐指数
1
解决办法
129
查看次数

方案:正确应用eval函数?

在工作中,我在尝试使用Scheme实现配置脚本时遇到了一个基本问题.为了避免发明一种人为的和受限制的语言,脚本应该包含实际的代码.稍后将对此代码进行评估.要使配置按需工作,必须能够访问某些变量.这些变量仅在评估的上下文中已知.因此,必须在当前环境中评估配置脚本.这是我所说的一个原始的例子:

(let ((a #t))
  (wr "a is ..."
    (eval '(if a "true" "false"))))
Run Code Online (Sandbox Code Playgroud)

运行此代码时,我总是收到一条错误消息,告诉我变量'a'未知.所以问题是:你知道如何评估当前环境中的冻结代码吗?

PS:我使用bigloo编译器.

/////////////////////////////////////////////编辑:/// ////////////////////////////////////////////////// /

当使用Chris建议的方法时,我遇到了另一个有趣的问题,即case关键字的用法.以下两个示例都使用相同的case结构,它应该触发输出"yes!".线.不幸的是,他们表现得不同

通常 - >输出是"是的!" 正如所料:

  (define testit "test")
  (case testit
    (("test")
     (begin (newline) (write "yes!") (newline)))
    (else
      (begin (newline) (write "no!") (newline)))))
Run Code Online (Sandbox Code Playgroud)

使用eval - >输出令人惊讶地"不":

  (define env (null-environment 5))
  (eval '(define testit "test") env)
  (eval '(case testit
           (("test")
            (begin (newline) (write "yes!") (newline)))
           (else
            (begin (newline) (write "no!") (newline))))) 
Run Code Online (Sandbox Code Playgroud)

这有任何意义吗?

scheme eval expression-evaluation bigloo

0
推荐指数
1
解决办法
1468
查看次数

C++ 11赋值表达式是从右到左计算的吗?

表达式的评估顺序一直是C++中未指定行为的来源.C++ 11标准最终是否说明评估的顺序应该是什么?

我们现在知道以下表达式的值var1var2:

int var1 =10, var2=20;
var1 = var2 = 30;
Run Code Online (Sandbox Code Playgroud)

它会是var1=30 and var2=30,还是var1=20 and var2=30

c++ expression expression-evaluation c++11

0
推荐指数
2
解决办法
1101
查看次数

如果不使用'&amp;&amp;'的语句是否有效?

int n = 5;    
if(2<=n<=20) 
 {
  cout << "hello";
 }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,它没有给出错误,它成功运行并且给出“ hello”作为输出。

但是我们必须使用&&这种方程式。
谁能解释一下?

c++ expression-evaluation

0
推荐指数
1
解决办法
151
查看次数

JavaScript 中的短路评估 - SyntaxError: Unexpected token 'return'

我想使用文章中&&示例所描述的短路评估语法(带运算符):

说,我有这种情况:

function externalFunction() {

    id == ...
    text == ...

    // OK: Standard if syntax is fine

    if ( aFunction(id, text) ) return

    // KO: Short circuit evaluation generate a RUN-TIME ERROR: 
    // SyntaxError: Unexpected token 'return'
    // anotherFunction(id, text) && return
    //                              ^^^^^^

    anotherFunction(id, text) && return


}
Run Code Online (Sandbox Code Playgroud)

为什么我有错误?也许我不能使用带有语言关键字 ( return)的单个语句?

javascript if-statement expression-evaluation node.js operator-keyword

0
推荐指数
1
解决办法
94
查看次数

尝试理解 C++ 中的 --x 与 x--

我正在尝试评估这一点,即使它很简单,我似乎也无法理解它。我得到了 16,但提供的答案是 12。我不明白这怎么可能是 12。

--x首先这样做了,所以首先y是 4,然后我需要乘以x--,但它也会是 4,因为它是在之后评估的,并且x之后会递减到 3。所以4*4 = 16

有人可以解释我的推理有什么问题吗?

int x, y;
x = 5;
y = --x * x--;
std::cout << y;
Run Code Online (Sandbox Code Playgroud)

c++ expression-evaluation undefined-behavior c++17

-2
推荐指数
1
解决办法
102
查看次数

Postfix增量运算符评估

是否在计算表达式之后或在评估整个语句之后评估后缀增量/减量运算符?

#include<stdio.h>

void main()
{
  int a=0;
  int b=0;

  printf("%d %d",a||b,b++);  // Output is 1 0

}
Run Code Online (Sandbox Code Playgroud)

我的编译器从右到左评估printf参数.表达式a || b的答案是1,这意味着b在评估|| b之前已经递增(即b在评估表达式b ++之后立即递增)

我在这里阅读C++中的增量 - 何时使用x ++或++ x?在整个语句之后计算后缀增量/减量.

哪个是对的?

c parameter-passing expression-evaluation operator-precedence

-3
推荐指数
1
解决办法
291
查看次数