问题#1:在循环中声明一个变量是一个好习惯还是坏习惯?
我已经阅读了其他关于是否存在性能问题的线程(大多数说没有),并且您应该始终将变量声明为接近它们将被使用的位置.我想知道的是,这是否应该避免,或者它是否真的是首选.
例:
for(int counter = 0; counter <= 10; counter++)
{
string someString = "testing";
cout << someString;
}
Run Code Online (Sandbox Code Playgroud)
问题2:大多数编译器是否已经声明变量已经被声明并且只是跳过了那个部分,或者它实际上每次都在内存中为它创建了一个位置?
我目前正在努力了解binary-size(number)Elixir的工作原理.在The Little Elixir&OTP Guidebook的例子中,有一节中它们分解了一个128字节的ID3标签.该标记具有以下属性:
他们在书中提取这个的方式是
<< "TAG", title :: binary-size(30), artist :: binary-size(30), album :: binary-size(30), year:: binary-size(4), _ :: binary >>
Run Code Online (Sandbox Code Playgroud)
我无法理解每个值如何从中获取正确的值binary-size(#num).也许这是模式匹配发生的顺序,我很难理解.目前我正在接近它,因为我们首先模式匹配三个字节的标头,因为它是硬编码的"TAG",此时我不确定我们如何从中获取30个字节的值binary-size(30).此操作是否分为两个独立的部分?我们是说第一个从128,总字节大小,我们减去30然后将大小(30)的值赋给标题,然后将这个更新的大小带到二进制模式匹配中的每个值,传播任何变化吗?
我正在尝试编写一个提示用户输入五位数的函数,并且我想编写一个异常块来处理错误的输入,以防用户尝试输入字符串或某些非整数输入.
我知道如何为分割函数编写一个异常处理块,其中你抛出一个分母为0的异常,但我不知道如何对我无法控制的输入执行此操作.
我正在为我的班级在Assembly中的嵌套循环工作.我想知道的是,如果我推动ecx,我需要将另一个值移动到ecx中,还是当前的那个具有与推送的ecx相同的信息?
例:
ArraySum PROC
push esi ; save esi, ecx
push ecx
mov eax, 0 ; set the sum to zero
L1:
add eax, [esi] ; add each integer to sum
add esi, TYPE DWORD ; point to next integer
loop L1 ; repeat for array size
pop ecx ; restore ecx and esi to original values
pop esi
ret ; sum is eax
ArraySum ENDP
Run Code Online (Sandbox Code Playgroud)
当我再次引用ecx它是否包含原始值5,即使该值被压入堆栈?可以说,使用与上面相同的代码,我添加一个循环.计数器是从5开始还是我需要重新初始化ecx?
我想也许这并不像我脑子里的那样措辞.我正在使用我的教科书,它确实有效.我想我的问题是,为什么它会使用ecx的原始值,如果我们推动它并且在推送后没有将另一个值移动到ecx?
PS我知道我使用的代码示例不是嵌套循环,但是这个函数在另一个循环中.并不是说它对我的问题有任何影响:)