在条件中进行作业是否有特殊名称?以下是我在C中询问的一个例子:
// Assume a and b have been previously defined and are compatible types
if( (a = b) ) { // <- What do you call that?
//do something
}
我的几个朋友和我确信它有一个名字,其他一些人已经同意有一个,但我们无法在任何地方找到它。这里有没有人听过这个词?
答案 0 :(得分:1)
虽然人们称之为各种各样的东西,但它并没有真正的名字。如果代码遵循您的问题:
if( a = b )...
然后常见术语是: bug ,错误等。但是,如果b
不是变量而是表达式,例如与常见的C模式一样:
if( (c = getchar()) != EOF )...
while( *q++ = *p++ )...
然后它可能被称为成语,模式等。
答案 1 :(得分:1)
假设某项作业是故意的,则没有特殊名称。 C语言规范对if
语句的控制表达式提出了非常弱的要求:
6.8.4.1-1: if语句的控制表达式应具有标量类型。
只要a
和b
是标量,赋值表达式就满足此要求。对此赋值的结果执行与零的隐式比较:
6.8.4.1-2:在两种形式中,如果表达式将une等于0,则执行第一个子语句。在else表单中,如果表达式比较等于0,则执行第二个子语句
请注意,编译器会在看到类似的分配时发出警告,因为缺少第二个=
是常见的错误来源。 You can prevent these warnings using parentheses, as described in this Q&A
答案 2 :(得分:0)
我不知道它是否有名字,但我称之为“无人理解的有用功能”。 它确实非常有用。 我们可以认为它是俚语。
例如,在C ++中,您可以通过直接声明变量来使用它,这对于安全检查非常有用:
if(Object * a = takeObject()){ // a不是nullptr }
或者当我不想在循环中重复声明时:
while (a = next()) {
}
而不是:
a = next();
while (a) {
a = next();
}
但通常这些只是错误,像gcc和clang这样的编译器会发出警告(并且它们会强迫你使用一个可怕的双重元组来使警告静音!)。