C# 递增数组
如果我想生成一个从1到6的数组,并增加了.01,那么最有效的方法是什么? 我想要的是一个数组,有分钟和最大的稍后会更改...这样:x[1,1.01,1.02,1.03...] 解决方案 假设A start,end和increment值,您可以进一步抽象: Enumerable .Repeat(start, (int)((end - start) / increment) + 1) .Select((tr, ti) => tr + (increment * ti)) .ToList() 让我们分解: Enumerable.Repeat获取起始数字,重复给定数量的元素,然后返回枚举(集合).在这种情况下,我们从start元素开始,找到start和end之间的差,然后将其除以increment(这为我们提供了start>>>>>> end)和end)和添加一个以包括原始数字.这应该为我们提供使用的元素数量.只需警告,由于increment是
26 2024-04-19
编程技术问答社区
为什么x++-+-++x是合法的,而x+++-+++x却不是?
我想知道为什么在C#中可以: int y = x++-+-++x; 但是 int y = x+++-+++x; 不是吗?为什么对 +? 有偏见 解决方案 其他两个答案是正确的;我将补充说,这说明了词汇分析的一些基本原理: 词汇分析仪是 的 - 它的" look-head" 很少 词汇分析仪是 greedy - 它试图使最长的令牌可以立即... 词汇分析仪不会在失败时试图找到替代解决方案. 这些原则暗示+++x将被列为++ + x,而不是+ ++ x. 然后,解析器将分析++ + x为++(+x),而(+x)不是 actible ,它是a value ,因此无法递增. 另请参阅:其他解决方案 我正在使用VS2012.这很有趣. 第一个可以解析为: int y = (x++) - (+(-(++x))); 而无需更改最终结果.因此,您可以看到为什么它有效. 第二个是+++x的问题有效的R值). 但是,您可以以各种方
20 2024-04-18
编程技术问答社区
C#和C++中的++i运算符的区别
我在C ++和C# 上写下以下代码 int i=0; ++i = 11; 此C#编译器带来错误 The left-hand side of an assignment must be a variable, property or indexer 但是C ++编译器生成此代码,没有任何错误,我得到了i的结果11.这种差异的原因是什么? 解决方案 区别在于,提前运算符是 lvalue ,而不是在C#中. 在C ++ ++i中返回对增量变量的引用.在c#++i中返回变量i的增量值. 因此,在这种情况下,++i是 lvalue 在C ++中, rvalue . 从C ++规范中有关前缀增量运算符 操作数的类型应为算术类型或指向 完全定义的对象类型.值是 操作数;它是 lvalue . P.S. Postfix增量运算符I ++在C#和C ++中都不是LVALUE,因此此代码行将带来两种语言的错误. int i=0; i++ = 11
18 2024-04-18
编程技术问答社区
C#-增加数字并在前面保留0
我需要做一个40位数计数器变量.它应该以0000000000000000000000000000000000000001 开始 并增加 0000000000000000000000000000000000000002 当我使用int类时,它会切断所有零.问题是,我需要将数字汇总,然后使用正确数量的领先零数量将其转换为字符串.总尺寸应为40位.因此,如果我达到50,则应该像这样: 0000000000000000000000000000000000000050 我该怎么做并保留零? 解决方案 转换为字符串时,请使用整数和格式或pad结果.例如 int i = 1; string s = i.ToString().PadLeft(40, '0'); 请参阅 jeppe Stig Nielson的答案对于我也永远不会记得的格式化选项. 其他解决方案 尝试使用 int myNumber = ...; string output = myNum
8 2024-04-18
编程技术问答社区
无休止的float循环
考虑以下代码: for (float i = 0f; i i 16777216.0 >i + 1 16777216.0 // ??? >i == i + 1 false // as expected, but a lack of consistency with upper statement >i + 2 16777218.0 为什么这样做? 2 24 +1? 什么是特别的 解决方案 这是由于浮点精度.它基于浮点算术的IEEE标准(当浮子本身存储较大的价值时,简单的单词本身;当前存储的数字和它可以存储的下一个数字之间的差异大于1,因此将1添加1不会增加其值. 如果您需要精确的十进制数字
16 2024-04-16
编程技术问答社区
在C#中,++i与i += 1在性能上有什么区别吗?
i + = a应该等于i = i + a. 在a == 1的情况下,据说这是++ i的效率较低,因为它涉及更多访问内存;或编译器将其与++ i? 完全相同 解决方案 这很容易回答:C#编译器将C#源代码转换为IL Opcodes.没有执行++运算符等效的专用IL操作码.这很容易查看您是否使用Ildasm.exe工具查看生成的IL.此示例C#片段: int ix = 0; ix++; ix = ix + 1; 生成: IL_0000: ldc.i4.0 // load 0 IL_0001: stloc.0 // ix = 0 IL_0002: ldloc.0 // load ix IL_0003: ldc.i4.1 // load 1 IL_0004: add
12 2024-04-15
编程技术问答社区
在C#中递增指南
我的应用程序具有一个GUID变量,它需要是唯一的(当然).我知道,从统计学上讲,任何GUID都应该被认为是唯一的,但是由于开发/测试环境原因,可以多次看到相同的值.因此,当这种情况发生时,我想"递增" GUID的值,而不仅仅是创建一个全新的值.似乎没有一种简单的方法来做到这一点.我找到了一个黑客,我将以可能的答案发布,但需要一个更清洁的解决方案. 解决方案 您可以获取GUID的字节组件,因此您可以对此进行处理: static class GuidExtensions { private static readonly int[] _guidByteOrder = new[] { 15, 14, 13, 12, 11, 10, 9, 8, 6, 7, 4, 5, 0, 1, 2, 3 }; public static Guid Increment(this Guid guid) { var bytes = guid.To
10 2024-04-15
编程技术问答社区
在C#中把一个字符串从数字0-9递增到小写字母a-z再到大写字母A-Z
我希望能够从" 000000"开始6个字符串长6个字符.然后,当我达到9时,我想通过一个" 000001"将其递增,当我到达Z时,我想转到'00000a',我想转到'00000a'.当达到" z"时,我想将第一个重置为0,然后从下一个位置" 000010"开始,等等. '000011','000012'...'0000A0','0000A1'...'0000A0','0000A1' 我将如何在C#? 中执行此操作 预先感谢您. 迈克 解决方案 这使用IntToString从问题private static readonly char[] baseChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); private const long targetBase = 62; private const long maxNum = 62L*62*62*62*
22 2024-04-14
编程技术问答社区
i = i++并不增加i,为什么?
可能的重复: 为什么这会进入无限循环? i = i++之类的事物在C和C ++中具有不确定的行为,因为标量对象的值在同一表达式中发生了两次,而无需介入序列点. 但是,我想这类表达式在C#或Java中具有明确的行为,因为Afaik的参数评估是向右到右的,并且遍布序列. 也就是说,我希望i = i++等于i++.但这不是.以下程序输出0. using System; class Program { static void Main(string[] args) { int i = 0; i = i++; Console.WriteLine(i); } } 您能帮我理解为什么吗? 免责声明: 我完全意识到,是否定义了上述结构的行为,它们是愚蠢的,无用的,不可读的,不必要的,不应在代码中使用.我只是好奇. 解决方案 该行为在C#中很好地定义,评估顺序为: 左侧i被评估为变量i
20 2024-04-11
编程技术问答社区
C#中的I ++和++ I有什么区别?
我已经看到它们都被用于许多C#代码,我想知道何时使用i++以及何时使用++i? (i是一个数字变量,例如int,float,double等). 解决方案 奇怪的是,其他两个答案似乎并没有说明,而且绝对值得一提的: i++表示'告诉我i的值,然后增加' ++i表示'增量i,然后告诉我值' 它们是收入前,加入后操作员. 在这两种情况下,变量都会增加,但是如果您在完全相同的情况下都采用两种表达式的值,则结果将有所不同. 其他解决方案 不幸的是,这里已经发布了此问题的典型答案是,一个人在"剩下的操作之前"进行增量,而另一个则在"剩下的操作"之后进行增量. 尽管直观地说明了这个想法,但该陈述面对完全错误的.时间 中的事件序列在C#中明确定义,并且强调不是 前缀(++ var)和后三个和后三(var ++)版本的情况++相对于其他操作,以不同的顺序进行操作. 毫不奇怪,您会看到这个问题的错误答案.许多"教自己C#"书也弄错了.同样,C#的方式与C的方式不同.
14 2024-04-10
编程技术问答社区
这个计划的结果是什么呢?
所以我陷入了这个问题. int i=5,a; a=++i + i++ + ++i + i++ - --i; printf("%d",a); 根据我的说法," A"应该是20. A = 6+6+8-8 但是,在执行时,我发现答案是18.我做错了什么?逐步的解释会有所帮助. 解决方案 这是未定义的行为.在序列点之间,变量不能多一次.您的程序可以输出任何内容.任何答案说否则是错误的. 其他解决方案 我在我的博客文章中以详细的方式写了这篇文章"> http://blog.susam.in/2010/05/sequence-points.html 我在这里发布了一些摘录. 在C编程论坛中,一次又一次地提出了一种特定类型的问题.关于此类问题有两件事会激发论坛中经验丰富的程序员.首先,这种类型的问题是如此普遍,以至于许多人甚至都不想回应它们,即使这意味着要发布到回答类似问题的另一个线程的链接.其次,更重要的是,即使有人试图为问题提供正确的答案,还有许多其他人忽略它
18 2024-04-10
编程技术问答社区
C语言GCC编译器中前后增量的意外行为
如果n具有值5,则输出: printf("%d %d", n++, ++n); //should be 5 and 7 ,但我以输出为6和7. 解决方案 多个未序列的修改导致这种不确定的行为.如果您搜索它,则有很多结果,例如此问题.. 下次启用所有警告时进行编译,因此: Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c main.c:6:22: warning: multiple unsequenced modifications to 'n' [-Wunsequenced] printf("%d %d", n++, ++n); ^ ~~ 其他解决方案 printf()调用未定义的行为. 请看一下不确定的行为和序列点 在函数呼叫参数列表 中修改变量值两次或更多的值不是一个好习惯
16 2024-04-10
编程技术问答社区
i=i++ +++c;和i=++i +c++的输出差异。
我不知道这是否是针对编译器的,但是当我尝试在 devc ++ 中运行两个表达式时 当i=c=b=0; i=i++ + ++c给出2而i=++i + c++给出1 1 但是 b=i++ + ++c和 b=++i + ++c对两个表达式产生结果1 我确实知道,在相同表达式中增加两次变量会导致根据 c 标准规范的不确定值,但我很好奇编译器如何产生这些输出.有人可以解释如何以及为什么吗? 解决方案 i++和++i是完全不同的,i++是后增量,这意味着在表达式中评估i,然后一旦评估就会增加. ++i表示增量,然后评估表达式. 我在您的示例中看到您设置i = ++i/i++,这是评论中提到的未定义行为. 其他解决方案 i++ + ++c,c被递增(至1 ),然后0 + 1存储在i>中,最后i递增,给出. ++i + c++,i是递增(至1 ),然后1 + 0存储在i中,然后c被递增. 这就是我会理解编译器所做的事情,但是正如其他所有人所说的那样,不要指望其
20 2024-04-10
编程技术问答社区
增量和减量操作符
#include int main() { int x = 4, y, z; y = --x; z = x--; printf("%d %d %d", x, y, z); } 输出:2 3 3 任何人都可以解释一下吗? i =+ j是什么意思(假设i = 1和j = 2)? 解决方案 简单说明: - x或++ x :将在后修改值. x-或x ++ :将在 之前修改值 详细说明: - x或++ x : predecrement/增量:将首先进行减少或增量的操作,然后将其分配x. x-或x ++ : post:decorment/regrement :将首先分配x的值,然后将其执行减少或增加之后的操作. 让我们以更好的格式编写您的代码,然后逐步浏览您的代码并注释它以直观地向您显示发生的情况: main() { //We declare the variables x, y and z,
12 2024-04-10
编程技术问答社区
C-在一个字符中增加一个数字
是否可以在字符串中单独增加一个数字? 假设我有: char someString = "A0001"; 有没有办法增加数字'0001'?使其成为A0002,A0003等? 解决方案 #include #include #include #include char *strinc(const char *str, int d, int min_width){ char wk[12];//12:max length of sizeof(int)=4 char *p; int len, d_len, c; c = len = strlen(str); while(isdigit(str[--c])); ++c; d += strtol(&str[c], NULL, 10); if(d
10 2024-04-09
编程技术问答社区
为什么ICC在x86的汇编中产生 "inc "而不是 "add"?
在摆弄简单的C代码时,我注意到了一些奇怪的东西.为什么ICC在为增量而不是addl $1, %eax生成的汇编代码中产生incl %eax? GCC的行为如预期的那样,使用add. 示例代码(-O3在GCC和ICC上都使用) int A, B, C, D, E; void foo() { A = B + 1; B = 0; C++; D++; D++; E += 2; } 在ICC上结果 L__routine_start_foo_0: foo: movl B(%rip), %eax #5.13 movl D(%rip), %edx #8.9 incl %eax
16 2024-04-09
编程技术问答社区
在while循环结束时,n++和++n的区别是什么?(ANSI C)
这可能是一个愚蠢的问题,但我无法弄清楚.它与N ++和++ N之间的差异有关(我认为我理解但显然不是). #include #include long algorithmA(int n); long algorithmB(int n); int main(){ long A, B; A = B = 0; int n = 1; while(A >= B){ A = algorithmA(n); B = algorithmB(n); n++; } printf("At n = %d, Algorithm A performs in %ld seconds & " "Algorithm B performs in %ld seconds.", n, A, B); } long algorithmA(int n){ re
26 2024-04-09
编程技术问答社区
C语言编程-K&R实例1.5.2-修改后的程序不能按预期运行
我的问题只是"为什么我的第10和11行上的代码无法正常运行?"我的代码的预期目的是完全按照原始的K&R代码进行操作,但是在任何时候不要计算NC(GetChar()=='\ n'),请您启发我吗? 略微修改的K&R代码: /** K&R - 1.5.2 Character Counting **/ #include /* count characters in input; 1st version */ main(){ long nc; nc = 0; while (getchar() != EOF){ if (getchar() != '\n'){ ++nc; } } printf("%ld\n", nc); } 我使用64位Windows 7,CodeBlocks10.05,GNU GCC编译器. 我目前的进度和理解: 在示例运行中,我输入单词two并击中Enter,该输入等于4个输入,
10 2024-04-09
编程技术问答社区
如何使指针增量为1个字节,而不是1个单位
我有一个结构tcp_option_t,是N字节.如果我有一个指针tcp_option_t* opt,并且我希望它会以1的速度增加,则不能使用opt++或++opt,因为这将通过sizeof(tcp_option_t)增量,sizeof(tcp_option_t)是N. 我只想将此指针移至1个字节.我目前的解决方案是 opt = (tcp_option_t *)((char*)opt+1); ,但这有点麻烦.有更好的方法吗? 解决方案 我建议您创建一个Char的指针并使用它横渡您的结构. char *ptr = (char*) opt; ++ptr; // will increment by one byte 当您需要再次从PTR恢复结构时,只需进行通常的铸件: opt = (tcp_option_t *) ptr; 其他解决方案 我知道这篇文章很旧,但是我也有同样的问题,并找到了这个解决方案: char **ptr = (char**)
8 2024-04-08
编程技术问答社区
了解指针式变量的增量
在阅读有关指针时,我发现一个指针变量用于指示这样的数组: char* chrArray; int* intArray; 之后,我找到了代码中使用的charArray++和intArray++指示charArray和intArray的下一个元素.但是到目前为止,我知道C中的char是1个字节,而数组中的int是4个字节.因此,我无法理解增量操作员在这里的行为.任何人都可以解释一下. 解决方案 这是由知道指针类型的编译器来处理的,因此可以通过相关大小来递增其存储的地址,无论它是char,int还是任何其他类型. 其他解决方案 根据C11标准文档,第6.5.2.5章, postfix增量和减少操作员 Postfix ++操作员的结果是操作数的值.作为副作用, 操作数对象的值是增加的(即适当类型的 值1 is 添加到它). 因此,每当您使用后缀增量运算符时,您都不会添加任何特定值,而是添加 value 1 的类型使用操作员的操作数. 现在为您的示例,
14 2024-04-07
编程技术问答社区