这段代码的作用是啥,使用的每个符号是啥意思?使用的语言是 C,我只是编码的初学者
Posted
技术标签:
【中文标题】这段代码的作用是啥,使用的每个符号是啥意思?使用的语言是 C,我只是编码的初学者【英文标题】:What does this piece of code do and what does each of the symbols used mean? The language used is C and I am just a beginner to coding这段代码的作用是什么,使用的每个符号是什么意思?使用的语言是 C,我只是编码的初学者 【发布时间】:2015-04-22 04:45:08 【问题描述】:遇到了一段我无法理解这两行代码在做什么的代码。甚至无法获得语法。请说明使用了哪些类型的功能,例如我猜在第一行中使用了条件运算符。
unsigned long long base_size = b >= 2 ? (b-2)/2:0;
printf("%llu\n",(base_size*(base_size+1))/2);
【问题讨论】:
是条件运算符 Ternary operator 获取一本关于 C 语言的书。然后查找 ?: 运算符,也称为三元运算符或条件运算符。接下来查找 printf 标准库函数及其格式字符串。 【参考方案1】:这里使用的是条件运算符(也称为三元运算符,因为它使用了3个表达式)条件运算符的格式是
expression1 ? expression2 : expression3.
现在让我解释一下。
如果expression1
的值为真,则整个表达式的值为expression2
的值,否则,整个表达式的值为expression3
。
现在举这个简单的例子
result = marks >= 50 ? 'P' : 'F' ;
如果表达式marks >= 50
的计算结果为真,result
将具有值'P'
,否则,result
将得到'F'
。
现在让我们继续处理您的案例
unsigned long long base_size = b >= 2 ? (b-2)/2:0;
printf("%llu\n",(base_size*(base_size+1))/2);
它检查是否b >= 2
,如果是,则将base_size
赋值为(b-2)/2
,否则将base_size
赋值为0。
也相当于
if( b >= 2 )
base_size = ( b - 2 ) / 2;
else
base_size = 0;
现在,以防万一你不知道
printf("%llu\n",(base_size*(base_size+1))/2);
它的作用是将base_size * ( base_size + 1 ) / 2
的值输出到您的输出屏幕上。
【讨论】:
【参考方案2】:根据operator priority是c,第一行有效
unsigned long long base_size = ( b >= 2 ? (b-2)/2:0 );
现在,( )
中的表达式使用ternary operator 或条件运算符。
根据C11
标准,第 6.5.15 章,语法为
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
语义是[按照我的重点]
第一个操作数被求值;它之间有一个序列点 评估和第二个或第三个操作数的评估 (以评估为准)。 第二个操作数只有在 首先比较不等于0;仅在以下情况下评估第三个操作数 第一个比较等于 0;结果是第二个的值 或第三个操作数(以被评估者为准)转换为下述类型注意。
注意:条件表达式不会产生左值。
那么,接下来,你的情况,
b >= 2 ? (b-2)/2:0
首先,评估第一个表达式b >= 2
。如果b
的值大于或等于2
,则返回1
,否则返回0
。
如果计算结果为1
,则执行第二个操作数(b-2)/2
,条件运算符的最终结果是表达式的值。
类似地,它的计算结果为0
,第三个操作数0
作为条件运算符的结果返回。
最后使用三元运算符的返回值来初始化unsigned long long base_size
变量。
关于第二行,printf()
是一个标准的C库函数,原型在stdio.h
。您可以在此here 上找到更多信息。
【讨论】:
@iharob 谢谢。顺便说一句,更新了我的答案。请审查它。 :-) @iharob 现在很高兴听到活跃的 SO 成员的消息。谢谢和欢呼!!【参考方案3】:这称为三元运算符
x = condition ? value : another_value;
意思
if (condition)
x = value;
else
x = another_value;
很明显value
和another_value
应该与x
具有相同的类型,并且condition
必须是一个可以计算为真值的表达式。
您发布的代码虽然看起来不太好,因为它很难阅读,但这样会更好
unsigned long long base_size;
base_size = (b >= 2) ? (b - 2) / 2 : 0;
printf("%llu\n", (base_size * (base_size + 1)) / 2);
这相当于
if (b >= 2)
printf("%llu\n", (((b - 2) / 2) * (((b - 2) / 2) + 1)) / 2);
else
printf("0\n");
【讨论】:
以上是关于这段代码的作用是啥,使用的每个符号是啥意思?使用的语言是 C,我只是编码的初学者的主要内容,如果未能解决你的问题,请参考以下文章