声明在循环外部的循环中使用的变量而不是内部更好吗?有时我会看到在循环中声明变量的示例.这是否有效地导致程序在每次循环运行时为新变量分配内存?或者.NET足够聪明,知道它真的是同一个变量.
例如,请参阅此答案中的以下代码.
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
while (true)
{
int read = input.Read (buffer, 0, buffer.Length);
if (read <= 0)
return;
output.Write (buffer, 0, read);
}
}
Run Code Online (Sandbox Code Playgroud)
这个修改过的版本会更有效吗?
public static void CopyStream(Stream input, Stream output)
{
int read; //OUTSIDE LOOP
byte[] buffer = new byte[32768];
while (true)
{
read = input.Read (buffer, 0, buffer.Length);
if (read <= 0)
return;
output.Write (buffer, 0, read);
}
}
Run Code Online (Sandbox Code Playgroud) 在此代码段中:
use strict;
use warnings;
use Data::Dumper;
my $r = [qw(testing this thing)];
print Dumper($r);
foreach my $row (@({$r})
{
print "$row\n";
$row .= 'mod';
}
print Dumper($r);
print Dumper(@({$r});
Run Code Online (Sandbox Code Playgroud)
我发现foreach 中的' ('之后' @'导致它无法正确循环.我不知道为什么这个代码甚至可以工作,因为没有结束括号.这是做什么的?它看起来是在动态创建一个新的变量,但不应该use strict"已经解雇了什么?
请帮助解释一下这@(是什么以及为什么它仍然在没有结束括号的情况下运行.
在这篇Code Golf帖子中,声称"定义中的第二个变量始终设置为1",这使得它成为一个格式良好的行:
int i=-1,c,o,w,b,e=b=w=o=c;
Run Code Online (Sandbox Code Playgroud)
据说除了i设置为1 之外的所有内容c都是自动1.
我以为我知道一些C,并认为这是非法的(是UB,如果有任何随机堆栈内容的结果).
C真的设置c为1吗?
c declaration definition undefined-behavior variable-declaration
我已经写了一段时间的C ++代码,但是一段时间以来,我一直在想一些事情,而没有找到一个明确的答案。
我的意思是:假设我有一个函数(可以是方法,可以是static,但不一定),并且该函数使用一些“重”对象(例如无法确定的字符串)在编译时很容易,但这在整个执行过程中是恒定的)。我实际遇到的一个示例如下:
/* Returns an endpoint for an API
* Based on the main API URL (getApiUrl())
*/
virtual QString getEndPointUrl() const override
{
QString baseUrl = getApiUrl();
QString endpointUrl = QString("%1/%2").arg(baseUrl, "endpoint");
return endpointUrl;
}
Run Code Online (Sandbox Code Playgroud)
当然,这只是一个例子(我知道QStrings具有自己独特的Qt内存管理功能,但是让我们承认我们正在处理基本对象)。
执行以下操作是一个好主意吗?
virtual QString getEndPointUrl() const override
{
/* We determine baseUrl only once */
static const QString baseUrl = getApiUrl();
/* We compute endpointUrl only once */
static const QString endpointUrl = QString("%1/%2").arg(baseUrl, "endpoint");
return endpointUrl; …Run Code Online (Sandbox Code Playgroud) 我在C上相当新,我不知道以下两个变量声明之间的区别:
int* ptr;
int *ptr;
Run Code Online (Sandbox Code Playgroud)
我认为在宣言中int* ptr;,ptr价值不能改变,而声明可以改变,int *ptr;
我不确定是不是这样.
请帮助我理解这两个声明背后的概念.
Java编译器如何处理以下交换机块?'b'变量的范围是什么?
请注意,'b'变量仅在switch语句的第一个分支中声明.尝试在第二个分支中声明它也会导致"重复的局部变量"编译错误.
int a = 3;
switch( a ) {
case 0:
int b = 1;
System.out.println("case 0: b = " + b);
break;
case 1:
// the following line does not compile: b may not have been initialized
// System.out.println("case 1 before: b = " + b);
b = 2;
System.out.println("case 1 after: b = " + b);
break;
default:
b = 7;
System.out.println("default: b = " + b);
}
Run Code Online (Sandbox Code Playgroud)
注意:上面的代码用java 1.6编译器编译.
java scope initialization switch-statement variable-declaration
题
如何在C中声明字符串变量?
背景
在我学习c的基础知识的过程中,我试图将我最古老的python程序之一移植Bob到C.在程序中,脚本会询问用户有关他或她自己的信息,然后吐出响应.几乎所有这些变量都raw_input用于它们的信息 - 变量是字符串.但是,我发现没有办法声明C变量.
码
到目前为止,我已经尝试将变量声明为类型char,int.这是代码,在您闲暇时切换类型.
int main(int argc, const char * argv[])
{
int name;
printf("What is your name?");
scanf("%s",&name);
printf("Your name is %s", name );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误信息
当我运行此代码时,Xcode返回一些奇怪的东西.这部分的全球化 - 全球突出显示.
0x7fff96d2b4f0: pcmpeqb(%rdi), %xmm0
Run Code Online (Sandbox Code Playgroud)
最后,雅虎答案说我不得不使用一种名为a的东西character array.它发布于5年前,所以我认为有更好的方法.
编辑
我正在按照C编程的教程学习.
我已经阅读了关于这个主题的几个先前提出的问题和答案[或非常相似],但他们都没有真正解决这一点.在声明一个新的布尔变量时,将它初始化为false是多余的[例如不必要]吗?
boolean selectedZone = false;
Run Code Online (Sandbox Code Playgroud)
而不是宣布
boolean selectedZone;
Run Code Online (Sandbox Code Playgroud)
我看过的其他帖子是 为什么Java的默认值为Boolean设置为true?和java中布尔值的默认值
我已经做了几个月的Swift编程了,我一直很好奇这个......
告诉Swift编译器声明中对象的类型是否有优势?即let image: UIImage = UIImage()
与不告诉编译器并让它在运行时推断类型相比.即let image = UIImage()
我认为告诉编译器对象类型而不是推断它的类型会更有效.我知道这个问题也适用于Objective-C语法,所以我会在标签中添加它.
open System
let x = (1, 2)
let (p, q) = x
printfn "A %A" x
printfn "B %A %A" p q
let y = Some(1, 2)
try
let None = y
()
with
| ex -> printfn "C %A" ex
let Some(r, s) = y
printfn "D %A" y
// printfn "E %A %A" r s
Run Code Online (Sandbox Code Playgroud)
当我取消注释最后一行时,编译器拒绝代码抱怨
/home/rRiy1O/prog.fs(16,19):错误FS0039:值或构造函数'r'未定义
/home/rRiy1O/prog.fs(16,21):错误FS0039:值或构造函数的' 没有定义
是不允许在解构中使用枚举let?
但首先,甚至当我注释掉最后一行...什么我在这里干什么?这是输出:
A (1, 2)
B 1 2
D Some (1, 2)
Run Code Online (Sandbox Code Playgroud)
为了记录,这是固定版本: …