我正在编写一些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的输出不同?
几年前,我遇到了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消息所暗示的那样,但它不起作用.
我知道这可能不是一个有用的行为,但我仍然希望重现它.
先感谢您.
在工作中,我在尝试使用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)
这有任何意义吗?
表达式的评估顺序一直是C++中未指定行为的来源.C++ 11标准最终是否说明评估的顺序应该是什么?
我们现在知道以下表达式的值var1和var2:
int var1 =10, var2=20;
var1 = var2 = 30;
Run Code Online (Sandbox Code Playgroud)
它会是var1=30 and var2=30,还是var1=20 and var2=30?
int n = 5;
if(2<=n<=20)
{
cout << "hello";
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,它没有给出错误,它成功运行并且给出“ hello”作为输出。
但是我们必须使用&&这种方程式。
谁能解释一下?
我想使用文章中&&示例所描述的短路评估语法(带运算符):
说,我有这种情况:
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
我正在尝试评估这一点,即使它很简单,我似乎也无法理解它。我得到了 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) 是否在计算表达式之后或在评估整个语句之后评估后缀增量/减量运算符?
#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
c++ ×4
bigloo ×1
c ×1
c++11 ×1
c++17 ×1
eval ×1
expression ×1
haskell ×1
if-statement ×1
javascript ×1
node.js ×1
scheme ×1
types ×1
visual-c++ ×1