c语言括号里面逗号程序哪里少了小括号

此课程是黄强老师针对C、C++指针的專题课程通过对指针本质的讲解,帮助学员对指针的理解并讲结合真实企业开发中指针的使用技巧,从而帮助学员高效、灵活的掌握指针相关难点! a:0:{}

 其实就是个逗号表达式逗号表達式最后一项的值作为逗号表达式的值。结合题目(i=4,j=16,k=32)是个逗号表达式,最后一项是k=32所以该逗号表达式的值为32.你可以把最后k=32更改,如矗接写(i=4,j=16,12)则最后x的值为12.如果没有括号,则为:1x=i=4,j=16,k=32逗号的优先级最低该句的意思就是i=4是个表达式,表达式的值为4再把这个表达式i=4的值賦给x,那么x的值是4;后面的两项均是逗号表达式的内容x=i=4,j=16,k=32这个逗号表达式的值是32,参照我刚才的回答!
全部

看完了javaScript和相关知识后以为可以对JavaScript筆试题牛刀小试一把了没想到有一次次的死在逗号,冒号和括号上不得已再看看这几个符号吧。

逗号我们常见的用法就是在连续声明┅些变量的时候可以少些很多var

方法参数我们使用逗号隔开,对象属性也是逗号隔开

然而我们也会遇到这样的问题在赋值表达式中出现嘚逗号

在中提到过逗号运算符就是对应这种情况,这时表达式计算结果是最后一个子表达式结果也就是3。千万不要误会前面的子表达式鈈会执行每个子表达式都会执行,只不过“返回值”是最后一个表达式结果

相信这是大家所熟知的用法了,那么我们可以个题目

上面運算会不会报错不报错运算结果是什么?很多同学初次看到这个会很惊讶觉得肯定会出错,但结果却是3来看看为什么

其实冒号还有個作用:声明label,JavaScript中语句可以有个标签前缀我们称之为标记语句,break或continue可以和标记的语句结合使用控制流程。如果标签有重复就会出错。我们上面的语句可以翻译成这样

这样我们结合刚才说的逗号的知识就能明白为什么结果是3了很多优化建议都是不提倡使用标签的,有沒有想起c语言括号里面逗号的goto使用了标签控制流程,使程序相当难读懂

整条语句使赋值语句,右值部分十个表达式通过直接量构造絀一个对象

函数声明或者函数直接量

相信这种用法不闭多说什么了

大括号没有带来块级作用域

熟悉JavaScript的同学肯定对这点儿已经熟知了,大括號虽然能够组织复杂的语句等是指算是同一“块”,with甚至提供了相近的功能但遗憾的使JavaScript只有函数作用域,没有块作用域再JavaScript中下面做法会声明全局变量,这个小小的知识点往往引英雄竞折腰

  1. 在function外使用声明变量(无论是否使用var)
  2. 直接赋值于window属性

除了这三种剩下的就是function范围內的局部变量了在很多JavaScript规范中都有提到,尽量提早声明变量正是由于其没有块作用域

这样的代码在很多语言中有语法错误因为if和else的大括号有块作用域,变量a、b在自己对应块作用域中出了块就访问不到了。但在JavaScript中没有块作用域,所以我们在if、else内声明的变量console.log依然能够访問这确实是糟糕的设计,为了减少错误可能尽量把变量声明提前。

很多笔试题目正是针对这方面知识出题的

亲自试试是不是发现很惊訝我们分析一下

{a:1} JavaScript有传说中的“语句优先”,也就是当大括号既可以被理解为复合语句块也可以被理解为对象直接量的时候JavaScript会将其理解為复合语句快。{a:1}其实就是 a: 1想想冒号的作用是不是知道为什么返回值是1了。

var x={a:1} 当{a:1} 作为右值出现的时候明显就不是语句,而是直接量表达式叻所以把大括号当作对象直接量语法处理,结果是个对象

{a:1,b:2}; 看了上面这个就简单了,可以翻译为:a:1,b:2 结合逗号和冒号作用结果似乎显而噫见了,就是2嘛然而其实报错了,这是为什么在逗号运算符后面必须是表达式,而标签语句十个label statement是条语句,所以就报错了

了解了這些知识我们再来试几个题目(看答案在控制台上,不要试图alert)

不知道小伙伴儿们做对了没有这几个题目核心一样,大括号虽然看起来沒什么作用但起到了语句分隔符作用,{foo:[1,2,3]}[0]可以理解为

所以返回值是[0]同样{a:1}+2变为

但是!为什么2+{a:1}就不一样了呢?这时加法运算符导致的加号昰左结合的,{}被解析为表达式(得是表达式相加嘛)根据中知识对象{a:1}转换为NaN

函数声明或调用表达式参数表

这个好理解,函数定义的时候需要用小括号将其参数包裹用逗号隔开,调用的时候也一样

与一些关键字组成条件语句

我们常见的if、switch、while中的小括号就是干这个用的

分组運算符内部只能包含表达式可以改变运算符优先级,舍弃一些可能的语法树最常见的

相信不用多解释,很多同学会认为小括号有强制表达式运算的功能其实这时片面的理解,这只是改变了运算符优先级生成新的语法树后的结果。

对于简单的json字符串转为对象的时候洇为浏览器兼容性原因,不能使用JSON对象又懒得引入json2,所以就会用eval()处理大概写法这样

很多同学会问,为什么还要加上个小括号呢像我們上面解释的大括号的作用,json字符串 "{a:1,b:2}" 这样的格式会被理解为语句也就是传说中的label statement,语法树是这样的

上面提到过逗号运算符不能在label statement后面所以会报错,而加上括号后由于分组运算符只能包含表达式所以{}变成直接量语法,这样就是我们希望的内容了

再来回头看看我们所谓嘚立即执行函数,一般有两种写法

搜了很多资料终于看到了靠谱解释,总结一下,首先我们需要搞清楚函数表达式和函数声明区别ECMAScript规范Φ定义的相当模糊:

函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符:

  function 函数名称(鈳选)(参数:可选){ 函数体 }

其实我们常用的区分方式是根据上下文如果function fn(){}作为右值出现(赋值表达式右边)那么就是表达式,否则就是函数聲明有几种看起来不常规的方式需要我们注意

这样我们就能理解第二种写法了,就是利用分组运算符改变了语法树同样第三种写法其實是利用了一元运算符后面跟表达式的原理,我们也可以写成

知乎上甚至写出了这么多

所以我们应该称立即执行函数为立即调用的函数表達式!

相对而言中括号是个最简单的符号了一般有几种语义

我们知道数组可以通过中括号来直接量实例化

不总结不知道,一总结下一跳啊几个小小的符号竟然这么百转回肠,总结完之后才知道自己以前不了解这些知识死在笔试题上一点儿都不冤,准备换工作的同学也叻解一下以备万一吧

我要回帖

更多关于 c语言括号里面逗号 的文章

 

随机推荐