while 循环条件中的语法是什么
What is this syntax in while loop condition?
while ( (i=t-i%10 ? i/10 : !printf("%dn",j)) || (i=++j<0?-j:j)<101 );
我在代码高尔夫上遇到了这个
请解释 ?
和 :
的用法,为什么 while 循环后没有语句?就像为什么括号后面有一个;
。
while 循环的括号内正在进行布尔运算:
while (boolean);
由于三元运算符是布尔运算符,因此它是完全合法的。
那么这是在做什么呢? 看起来像模算术,打印范围高达 101。
我同意它是神秘和晦涩的。 它看起来更像是一个代码混淆亚军。 但它似乎是可编译和可运行的。 你试过吗? 它做了什么?
?:
是一个三元运算符。
形式<A> ? <B> : <C>
表达式的计算结果为:
- 如果
<A>
为 true,则其计算结果为<B>
- 如果
<A>
为假,则计算结果为<C>
while
循环后的;
表示空指令。相当于写作
while (<condition>) {}
您发布的代码似乎被混淆了。
请解释
?
和:
的用法
这就是条件运算符。 a ? b : c
计算a
并将其转换为布尔值。然后它计算b
是否为真,如果为假,则c
,表达式的总体值是计算b
或c
的结果。
所以第一个子表达式:
- 将
t-i%10
分配给i
。该表达式的结果是i
的新值。 - 如果
i
不为零,则表达式的结果为i/10
- 否则,print
j
,表达式的结果为零(因为printf
返回打印的字符数的非零计数,!
转换为零(。
然后,仅当第一个表达式的结果为零时,才计算 ||
之后的第二个子表达式。我会让你弄清楚这是做什么的。
为什么 while 循环后没有语句?
有一个空语句,;
,所以循环体不做任何事情。所有操作都发生在条件表达式的副作用中。当代码的目的是使读者感到困惑时,这是一种常见的技术;但是在编写你关心的任何人都可能需要维护的代码时,请不要做这种事情。
这是条件运算符(也称为三元运算符(。
它是一个单行语法,与条件 doA else (:)
doB 相同if (?)
;
在您的示例中:
(i=t-i%10 ? i/10 : !printf("%dn",j)
相当于
if (i=t-i%10)
i/10;
else
!printf("%dn",j);
?:是 if else 的简写符号
(i=t-i%10 ? i/10 : !printf("%dn",j)<br>
等于
if( i= t-i%10 )
then { i/10 }
else { !printf("%dn",j) }
当 || 之前的语句为真或 || 之后的语句为真时,您的 while 循环将运行。
请注意,您的代码没有任何意义。
i=t-i%10 ? i/10 : !printf("%d",j(( ||(i=++j<0?-j:j(<101 (;
在我能为你做的最人性化的可读中,它相当于:
while (i < 101)
{
i = (t - i) % 10;
if (i > 0)
{
i = i / 10;
}
else
{
printf("%dn",j);
}
i = ++j;
if (i < 0)
{
i = i - j;
}
else
{
i = j;
}
}
问候。
我是该代码的骄傲肇事者。这是完整版本:
main()
{
int t=getchar()-48,i=100,j=-i;
while ((i=t-i%10?i/10:!printf("%dn",j)) || (i=++j<0?-j:j)<101 );
}
这是我对编程挑战或"代码高尔夫"的提交,要求您创建最小的程序,该程序将接受数字作为参数,并打印 -100 到 100 范围内包含给定数字的所有数字。禁止使用字符串或正则表达式。
这是挑战的链接。
关键是它将所有工作都做到一个计算结果为布尔值的语句中。事实上,这是将两个不同的 while 循环合并为一个循环的结果。它等效于以下代码:
main()
{
int i,t=getchar()-'0',j=-100;
do
{
i = j<0? -j : j;
do
{
if (t == i%10)
{
printf("%dn",j);
break;
}
}
while(i/=10);
}
while (j++<100);
}
现在让我们稍微剖析一下这个循环。
首先,初始化。
int t=getchar()-48,i=100,j=-i;
将从标准输入中读取字符。您应该键入一个介于 0 和 9 之间的数字。48 是零字符 ('0'( 的值,因此 t 最终将保留一个介于 0 和 9 之间的整数。
i 和 j 将为 100 和 -100。j 将从 -100运行到 100(包括 100(,I 将始终保持 j 的绝对值。
现在循环:
while ((i=t-i%10?i/10:!printf("%dn",j)) || (i=++j<0?-j:j)<101 );
让我们把它读成
while ( A || B ) /* do nothing */ ;
A 等于 (i=t-i%10?i/10:!printf("%d",j(( 且 B 等于 (i=++j<0?-j:j(<101
关键是 A 被评估为布尔值。如果为 true,则根本不会计算 B,循环将再次执行。如果为 false,则将评估 B,反过来,如果 B 为真,我们将再次重复,一旦 B 为假,循环将被退出。
所以A是内循环,B是外循环。让我们剖析它们
(i=t-i%10?i/10:!printf("%dn",j))
它是形式的三元运算符 i = 条件?X : Y;这意味着将评估第一个条件。如果为 true,i 将被设置为 X 的值;否则我将设置为 Y。
这里的条件(t-i%10(可以读作t - (i%10(。如果 i 模 10 与 t 不同,则计算结果为 true,如果 i%10 和 t 值相同,则计算结果为 false。
如果不同,则相当于 i = i/10;如果相同,则操作将为 i = !printf("%d",j(
如果你仔细想想,你会发现它只是一个循环,用于检查 i 中整数中的任何十进制数字是否等于 t。
循环将继续运行,直到耗尽 i 的所有数字(i/10 将为零(或运行 printf 语句。Printf 返回打印的位数,该位数应始终大于零,因此 !printf(...( 应始终计算为 false,同时终止循环。
现在对于 B 部分(外循环(,它将只递增 j 直到达到 101,并将 i 设置为 j 的绝对值。
希望我说得有道理。
是的,我通过在谷歌中搜索我的代码找到了这个线程,因为我找不到挑战帖子。
- C++避免重复声明的语法是什么
- 使用基类指针调用基类的值构造函数的语法是什么?
- 这行/语法是什么意思?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 将引用绑定到指针的语法是什么?(各种)
- 这个typedef和转换运算符语法是什么意思
- 此语法是什么意思.(::*).
- 将显式指定的函数模板重载作为模板参数传递的正确语法是什么?
- 使用 pybind11 绑定 typedef 类型的正确语法是什么?
- 将此类传递给引用的正确语法是什么?
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- 在TensorFlow C++中用于feed_dict的语法是什么?
- 调用模板化类内的枚举类枚举器的正确语法是什么
- 返回没有 typedef 的成员函数指针的语法是什么?
- 将强制转换运算符重载到 std::map 的正确语法是什么
- 这种增量语法是什么意思
- 返回结构的方法的正确语法是什么
- C 中的(*)语法是什么意思
- 堆栈(int = 10),这个语法是什么意思(C++)
- variadic模板阵列参考参数的语法是什么?