选标写存候给定一个字符串来代表一个学生的出勤记录散侵吧

原来这是两个同心圆的相交部分,(最中间是空的)我画的1和2部分加起来就是了。 无法理解字面意思。害 题意:计算两个一样的圆环相交的面积,给出r1小的圆的半径,r2是大的圆的半径,接下去给出两行x、y,代表两个圆环的圆心。 思路: 两个大的圆的相交部分-左边大圆和右边小圆的相原型设计工具比较及实践 墨刀、Axure、Mockplus的区别和差异 墨刀官网地址:https://modao.cc/ 墨刀 墨刀,可以说是专为移动端产品原型设计而生。它的免费版本自带的部件、交互、功能,基本上能满足移动端产品原型的设计要求,并且墨刀的控件都是基于APP,以及系统平台IOS和安卓,给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 示例 2: 示例 3: 来源:力扣(LeetCode) 链接:https://leetcode cn.com/problems/longest substring without repeating charactersSITE:www.cnblogs.com 薇信:因为之前接触过相关研究,困囧于该系列资料匮乏,想做一个系列。个人道行太浅,不足之处还请见谅。愿与诸君共勉。 数据准备: MODIS数据产品MOD13Q1—以2010年河南省3、4、5三个月为例: 一、MRT单次数据操作 (1).进入GUI界面操作 1.将所需处理的一个.hd优先级决定表达式中各种不同的运算符起作用的优先次序,而结合性则在相邻的运算符的具有同等优先级时,决定表达式的结合方向。

  

  (一)a = b = c;

  

  关于优先级与结合性的经典示例之一就是上面这个“连续赋值”表达式。

  

  b的两边都是赋值运算,优先级自然相同。而赋值表达式具有“向右结合”的特性,这就决定了这个表达式的语义结构是“a = (b = c)”,而非“(a = b) = c”。即首先完成c向b的赋值(类型不同时可能发生提升、截断或强制转换之类的事情),然后将表达式“b = c”的值再赋向a。我们知道,赋值表达式的值就是赋值完成之后左侧操作数拥有的值,在最简单的情况下,即a、b、c的类型完全相同时,它跟“b = c; a = b;”这样分开来写效果完全相同。

  

  一般来讲,对于二元运算符▽来说,如果它是“向左结合”的,那么“x ▽ y ▽ z”将被解读为“(x ▽ y) ▽ z”,反之则被解读为“x ▽ (y ▽ z)”。注意,相邻的两个运算符可以不同,但只要有同等优先级,上面的结论就适用。再比如“a * b / c”将被解读为“(a * b) / c”,而不是“a * (b / c)”——要知道这可能导致完全不同的结果。

  

  而一元运算符的结合性问题一般会简单一些,比如“*++p”只可能被解读为“*(++p)”。三元运算符后面会提到。

  

  (

  

  const char* p = str;

  

  while(*p++);

  

  return p - str - 1;

  

  }

  

  注意上面函数中最后的减1。虽然是否退出while循环是由p的当前值解引用决定的,但即使while要退出,在“正式”退出之前,后自增(“++”)加1的副作用还是要体现。也可以这么理解:所谓“退出循环”,是指“不再执行循环体”,但控制表达式并非循环体的一部分,它的所有副作用在整个表达式结束之前都会生效。所以,我们最后要减掉循环退出时多走的这一步。

  

  还想重复一遍:*p++就是*(p++),它们除了可读性之外没有任何区别,所以那种认为加上括号就可以实现先加1再解引用的想法是错误的。要达到那样的效果,可以用“*++p”。

  

  (三)x > y ? 100 : ++y > 2 ? 20 : 30

  

  这个表达式看起来有点吓人。让我们先给出更多的上下文吧:

  

  [cpp] view plaincopy

  

  int x = 3;

  

  int y = 2;

  

  int z = x > y ? 100 : ++y > 2 ? 20 : 30;

  

  此时,z的值该是多少呢?

  

  这里面是两个条件运算符(?:,也叫“三目运算符”)嵌套,许多人会去查条件运算符的特性,得知它是“向右结合”的,于是认为右侧的内层条件运算“++y > 2 ? 20 : 30”先求值,这样y首先被加1,大于2的条件成立,从而使第二个条件运算取得结果“20”;然后再来求值整个条件表达式。这时,由于y已经变成3,“x > y”不再成立。整个结果自然就是刚刚求得的20了。

  

  这种思路是错误的。

  

  错误的原因在于:它把优先级、结合性跟求值次序完全混为一谈了。

  

  首先,在多数情况下,C语言对表达式中各子表达式的求值次序并没有严格规定;其次,即使是求值次序确定的场合,也是要先确定了表达式的语义结构,在获得确定的语义之后才谈得上“求值次序”。

  

  对于上面的例子,条件运算符“向右结合”这一特性,并没有决定内层的条件表达式先被求值,而是决定了上面表达式的语义结构等价于“x > y ? 100 : (++y > 2 ? 20 : 30)”,而不是等价于“(x > y ? 100 : ++y) > 2 ? 20 : 30”。——这才是“向右结合”的真正含义。

  

  编译器确定了表达式的结构之后,就可以准确地为它产生运行时的行为了。条件运算符是C语言中为数不多的对求值次序有明确规定的运算符之一(另位还有三位,分别是逻辑与“&&”、逻辑或“||”和逗号运算符“,”)。

  

  C语言规定:条件表达式首先对条件部分求值,若条件部分为真,则对问号之后冒号之前的部分求值,并将求得的结果作为整个表达式的结果值,否则对冒号之后的部分求值并作为结果值。

  

  因此,对于表达式“x > y ? 100 : (++y > 2 ? 20 : 30)”,首先看x大于y是否成立,在本例中它是成立的,因此整个表达式的值即为100。也因此冒号之后的部分得不到求值机会,它的所有副作用也就没机会生效。

  

  总结一下,本文主要阐述了以下几点:

  

  (1)优先级决定表达式中各种不同的运算符起作用的优先次序,而结合性则在相邻的两个运算符的具有同等优先级时,决定表达式的结合方向;

  

  (2)后自增(后自减)从语义效果上可以理解为在做完自增(自减)之后,返回自增(自减)之前的值作为整个表达式的结果值;

  

  (3)准确来讲,优先级和结合性确定了表达式的语义结构,不能跟求值次序混为一谈。

  

  [PS-1] 维基百科上有C/C++语言运算符表:http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

  

  [PS-2] 曾在新浪微博上见benbearchen提到有的公司在代码规范中要求:如果while的循环体为空语句,那么必需以continue语句代替,不准只写一个分号。我本人很赞成这个。上面strcpy和strlen的两个例子之所以没那么用,只是为了“随大流”,因为这两个函数的示例实现,许多人、许多书上都这么写。

  

  一.运算符的优先级

  

  在C++ Primer一书中,对于运算符的优先级是这样描述的:

  

  Precedence specifies how the operands are grouped. It says nothing about the order in which the operands are evaluated.

  

  意识是说优先级规定操作数的结合方式,但并未说明操作数的计算顺序。举个例子:

  

  6+3*4+2

  

  如果直接按照从左到右的计算次序得到的结果是:38,但是在C/C++中它的值为20。

  

  因为乘法运算符的优先级高于加法的优先级,因此3是和4分组到一起的,并不是6与3进行分组。这就是运算符优先级的含义。

  

  二.运算符的结合性

  

  Associativity specifies how to group operators at the same precedence level.

  

  结合性规定了具有相同优先级的运算符如何进行分组。

  

  举个例子:

  

  a=b=c=d;

  

  由于该表达式中有多个赋值运算符,到底是如何进行分组的,此时就要看赋值运算符的结合性了。因为赋值运算符是右结合性,因此该表达式等同于(a=(b=(c=d))),而不是(a=(b=c)=d)这样进行分组的。

  

  同理如m=a+b+c;

  

  等同于m=(a+b)+c;而不是m=a+(b+c);

  

  三.操作数的求值顺序

  

  在C/C++中规定了所有运算符的优先级以及结合性,但是并不是所有的运算符都被规定了操作数的计算次序。在C/C++中只有4个运算符被规定了操作数的计算次序,它们是&&,||,逗号运算符(,),条件运算符(?:)。

  

  如m=f1()+f2();

  

  在这里是先调用f1(),还是先调用f2()?不清楚,不同的编译器有不同的调用顺序,甚至相同的编译器不同的版本会有不同的调用顺序。只要最终结果与调用次序无关,这个语句就是正确的。这里要分清楚操作数的求值顺序和运算符的结合性这两个概念,可能有时候会这样去理解,因为加法操作符的结合性是左结合性,因此先调用f1(),再调用f2(),这种理解是不正确的。结合性是确定操作符的对象,并不是操作数的求值顺序。

  

  同理2+3*4+5;

  

  它的结合性是(2+(3*4))+5,但是不代表3*4是最先计算的,它的计算次序是未知的,未定义的。

  

  比如3*4->2+3*4->2+3*4+5

  

  以及2->3*4->2+3*4->2+3*4+5和5->3*4->2+3*4->2+3*4+5这些次序都是有可能的。虽然它们的计算次序不同,但是对最终结果是没有影响的。

猜你喜欢

转载自www.cnblogs.com/zhleonix/p/12729658.html