我试图弄清楚为什么我的C编译器使用以下(简化的)代码不会给我任何警告/错误。
函数声明没有参数,而函数实现则具有参数:
some.h:
void foo();
some.c:
static uint32_t count = 0;
void foo(uint32_t num) {
count += num;
print("Count: %u");
}
Run Code Online (Sandbox Code Playgroud)
main.c:
foo(100);
foo();
Run Code Online (Sandbox Code Playgroud)
输出:
Count: 100
Count: 100
Run Code Online (Sandbox Code Playgroud)
用于目标构建的编译器:
gcc-arm-none-eabi-4_9-2015q1-20150306-win32
Run Code Online (Sandbox Code Playgroud)
用于目标构建的链接器:
gcc-arm-none-eabi-4_9-2015q1-20150306-win32
Run Code Online (Sandbox Code Playgroud)
编译器标志:
-Wall -Werror -DuECC_CURVE=uECC_secp256r1 -DMEMORY_CHECK -DDEBUG -Os -g3 -DBACKTRACE
假设一个方法正在改变通过引用传递的参数的值.在整个应用程序中或仅在方法返回后,此操作的效果是否立即可见?
下面是一个重要的例子:
int x = 0;
void Foo(ref int y)
{
++y;
Console.WriteLine(x);
}
Foo(ref x);
Run Code Online (Sandbox Code Playgroud)
它可以在http://csharppad.com/gist/915318e2cc0da2c2533dfa7983119869下的C#Pad中运行
该函数Foo
可以访问变量,x
因为它在同一范围内,并且恰好在调用站点接收对它的引用.如果效果++y
是立即的,那么输出应该是1
,但我可以想象一个编译器生成代码,例如,将本地值存储在寄存器中,并在返回之前的某个时间转储到内存中.语言规范是否确保输出1
是否允许抖动优化,使输出实现依赖?
出于某种原因,我机器上的Haskell永远不会从任何getLine调用返回.例如,我尝试直接从Learn Your a Haskell for Great Good运行以下代码:
main = do
putStrLn "Hello, what's your name?"
name <- getLine
putStrLn ("Hey " ++ name ++ ", you rock!")
Run Code Online (Sandbox Code Playgroud)
当我运行它时,第一行被打印,当我输入一个名字时,我看到了我的输入,但是当我按下Enter键时,程序只是阻塞那里并且从不打印最后一行.
我该怎么解决这个问题?
编辑:我从Sublime IDE运行它,也许这与它有关
在我正在阅读的其中一本教科书中说"在编译时检查类型的兼容性,子范围需要运行时范围检查." 如果我说得对,那么当将新值分配给在某个子范围(子类型)中定义的变量时,必须执行运行时检查.类型不一样吗?为何如此区别?这只是编译器的默认值吗?
所有:
我有一个非常简单的C测试代码,使用英特尔编译器为浮点运算的大循环做一些计时,代码(test.c
)如下:
#include <sys/time.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <omp.h>
int main(char *argc, char **argv) {
const long N = 1000000000;
double t0, t1, t2, t3;
double sum=0.0;
clock_t start, end;
struct timeval r_start, r_end;
long i;
gettimeofday(&r_start, NULL);
start = clock();
for (i=0;i<N;i++)
sum += i*2.0+i/2.0; // doing some floating point operations
end = clock();
gettimeofday(&r_end, NULL);
double cputime_elapsed_in_seconds = (end - start)/(double)CLOCKS_PER_SEC;
double realtime_elapsed_in_seconds = ((r_end.tv_sec * 1000000 + r_end.tv_usec)
- (r_start.tv_sec …
Run Code Online (Sandbox Code Playgroud) 使用 maven (mvncompile) 编译 scala 项目时,出现错误:java.lang.StackOverflowError。我也从 Eclipse 中得到了相同的结果,但可以通过提供附加命令行参数来解决它: -J-Xss256m for scala compiler ,如此处给出的How to raise scala stack size
但我在执行“mvn编译”时遇到同样的错误。我该如何解决这个问题?基本上如何在通过 Maven 构建时增加 scala 堆栈大小
我尝试创建一个宏来定义X,但08和09被编译器误解为杂散运算符.当其他人工作正常时,为什么这些失败?
#define LIST_TEST_X \
X(A,01)\
X(B,02)\
X(C,03)\
X(D,04)\
X(E,05)\
X(F,06)\
X(G,07)\
X(H,08)\
X(I,09)\
X(K,10)
enum XEnum
{
#define X(A, b) A=b,
LIST_TEST_X
#undef X
};
Run Code Online (Sandbox Code Playgroud) 我正在使用MatLab
绘制我的数据,现在我有兴趣从中Mathematica
获取颜色方案,因为那些MatLab
实际上并不是最好的.
有没有办法导入它们MatLab
?
如果没有,有没有办法让类似的配色方案,如DarkRainbow或彩虹的MatLab
?(我讨厌喷气机,MatLab
因为一个人看不到黄线)
Python编译器是否可以识别在函数中定义的常量,这样,无论随后在代码中调用该函数多少次,它仅计算一次它们的值?
例如,
def f():
x = [ 1, 2, 3, 4 ]
# stuff
for i in range( 100 ):
f()
Run Code Online (Sandbox Code Playgroud)
会x
重新计算100次f()
调用吗?
并非总是可以在使用常量的函数之外定义常量,我很好奇Python是否在这种情况下得到了支持。
考虑以下代码:
#include <optional>
#include <string_view>
int main() {
std::optional<std::string_view> opt { "abc" };
std::cout << opt.value();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它编译并在运行时将“abc”输出到控制台。为什么要编译?main 中的第一行代码应该是:
std::optional<std::string_view> { std::string_view { "abc" } };
Run Code Online (Sandbox Code Playgroud)
编译器如何知道使用文字调用 string_view 构造函数?这似乎不仅仅是我以前见过的类型推导。这里似乎编译器正在向我的源代码添加代码,即对构造函数的调用。
c ×2
c++ ×2
ada ×1
auto ×1
c# ×1
color-scheme ×1
colors ×1
declaration ×1
for-loop ×1
gcc ×1
haskell ×1
intel ×1
jit ×1
local ×1
macros ×1
matlab ×1
maven ×1
optimization ×1
performance ×1
python ×1
scala ×1
semantics ×1
stack-size ×1
sublimetext ×1
timing ×1
types ×1